前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Silverlight中的帧

Silverlight中的帧

作者头像
菩提树下的杨过
发布2018-01-23 14:36:23
9070
发布2018-01-23 14:36:23
举报

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 菩提树下的杨过

代码语言:js
复制
<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 菩提树下的杨过

代码语言:js
复制
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不仅仅只能用来显示时间,还能做更多的事情,大家就尽情发挥想象吧:)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009-12-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档