zoukankan      html  css  js  c++  java
  • Silverlight中的帧

    Silverlight是基于时间线的,不象Flash是基于帧的,所以在Silverlight中,很少看到有文档专门介绍SL中的帧。

    但是我们从动画原理知道,动画只不过是一幅幅静态图片连续播放,利用人眼的视觉暂留形成的,因此任何动画从原理上讲,至少还是有每秒播放多少帧这个概念的。

    Silverlight的sdk文档中,有一段话:

    ...
    maxFramerate 值可通过 Silverlight 插件对象的 maxframerate 参数进行配置。maxframerate 参数的默认值为 60。currentFramerate 和 maxFramerate 是报告每秒帧数 (fps) 的值。实际显示的帧速率设置为较低的数字。可以通过特意设置一个较低的 maxframerate 值(如 2,每秒 2 帧)来阐述 currentFramerate 与 maxFramerate 之间的关系。
    ...

    即sl每秒种默认最多播放60帧,当然我们也能用代码来改变该值(比如设置到100),但最终sl的当前播放速度与硬件有关,并不是你想设多高就能达到多高。


    测试xaml:

    代码 by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ 
    <UserControl x:Class="CompositionTarget_Rendering.MainPage"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable
    ="d" d:DesignWidth="640" d:DesignHeight="480">
        
    <StackPanel x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Center" >
            
    <TextBlock Text="ready" x:Name="txt" HorizontalAlignment="Center"></TextBlock>
            
    <StackPanel  Margin="5">
                
    <Slider Width="200" Minimum="1" Maximum="100" x:Name="slider" ValueChanged="slider_ValueChanged" Value="60" ></Slider>
                
    <TextBlock x:Name="txtMax" Margin="0,5,0,0"  HorizontalAlignment="Center" Text="60" ></TextBlock>
            
    </StackPanel>
        
    </StackPanel>
    </UserControl>

    sl中有一个CompositionTarget.Rendering事件可以在每帧进入(刚开始播放)时触发,测试cs代码:

    代码 by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ 
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Interop;
    using System.Windows.Media;


    namespace CompositionTarget_Rendering
    {
        
    public partial class MainPage : UserControl
        {
            
    bool isLoaded = false;

            
    public MainPage()
            {
                InitializeComponent();           
                
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);            
            }

            
    void MainPage_Loaded(object sender, RoutedEventArgs e)
            {

                CompositionTarget.Rendering 
    += new EventHandler(CompositionTarget_Rendering);
                isLoaded 
    = true;
               
            }

            
    /// <summary>
            
    /// 该事件在进入每一帧时触发
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void CompositionTarget_Rendering(object sender, EventArgs e)
            {            
                
    this.txt.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
            }

            
    private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
            {
                
    if (isLoaded)
                {
                    Settings settings 
    = Application.Current.Host.Settings;
                    settings.EnableFrameRateCounter 
    = true;
                    settings.MaxFrameRate 
    = (int)slider.Value;
                    txtMax.Text 
    = settings.MaxFrameRate.ToString();
                }
            }

            
        }
    }

    进入每帧时,我们让txt显示当前时间,同时拖动滑块,还能设置当前动画每秒播放的最大帧数,运行效果:

    拖动滑块,观察一下时间更新的快慢,同时注意浏览器左下角状态栏的显示,当然 CompositionTarget.Rendering不仅仅只能用来显示时间,还能做更多的事情,大家就尽情发挥想象吧:)
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    二层设备与三层设备的区别--总结
    转载-vim配置收藏
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    树莓派进阶之路 (037)
    基于Centos搭建个人 Leanote 云笔记本
    基于CentOS搭建私有云服务
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1632271.html
Copyright © 2011-2022 走看看