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

时间: 2024-10-27 01:30:25

Silverlight中的帧的相关文章

silverlight中&quot;制作逐帧动画&quot;/&quot;播放gif&quot;收集

"逐帧动画"与"播放GIF"貌似二个风马牛不相干的问题,其实不然! 因为silverlight中的image控件不支持直接把gif动画做为source,所以象做动画常用的"走路的小人","加载loading小动画"...这类经典gif素材,无法直接使用,只能转化为逐帧动画来处理.  nasa(silverlight MVP)给出于二种经典的办法:  1.类似老式电影放胶片的原理,用storyboard机制实现 原文:http:

Silverlight制作逐帧动画 v2 - part1

Silverlight制作逐帧动画 v2 - part1   在silverlight 2的时候我写过一篇<Silverlight制作逐帧动画>,这个是采用storyboard的原理来做的.现在到了silverlight 3最近又想到一个动态将Rectangle的Fill属性设置为动画每一帧的图形.完全用代码的形式来实现动画. 这里先放出一个原型.   首先准备好素材,我准备做一个4帧的飞机小动画.这个比之前采用storyboard做动画的好处是不用对坐标(一张长的图片做起来太累了). 这个飞

在Silverlight中使用SmoothStreamingMediaElement创建Smooth Streaming播放器

我在"IIS 7 Smooth Streaming技术在Silverlight 3中的应用 "一文中详细介绍了有关 IIS 7.Smooth Streaming技术以及如何在Silverlight中使用MediaElement控件播放Smooth Streaming视频的内容,在继续本文之前,如果你对什么是Smooth Streaming还存在疑问,你 可以先去看看我的那篇文章,也算作是一个入门吧. 在上一文中我向大家介绍了如何利用现有的MediaElement控件来支持Smooth

Silverlight中使用CompositionInitializer宿主MEF

MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也 可以在RIA的Silverlight中使用.在Silverlight中只是宿主的方式有所不同,实际上在 Silverlight中也可以像传统应用程序中是方式去宿主,MEF也为Silverlight提供了独特的宿 主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll动态链 接库. Silverlight中提供了一种新的宿主ME

利用F#在Silverlight中实现并行编程

随着.NET 4的发布,要在.NET平台之上进行并行编程可谓是易如反掌.实际上,微软为大家提供了三种并行编程的基础功能.第一种是提供给C++使用的并发运行时 (Concurrency Runtime);第二种是藉由.NET平台提供给托管语言的一组并行编程函数库(包括TPL.PLINQ和并行编程数据结构等);最后一种就是基于F# 本身的并行编程特性. 然而,由于考虑精简的缘故,当前的CoreCLR并未包含.NET 4中的并行函数库,从而在Silverlight(即使最新的Silverlight 4

Silverlight中的像素和比例缩放

最近在学习Silverlight,也在准备考六级,同时在网上找到的一些Silverlight的教程都是beta1的,在正式版中有很多的问题,所以尝试着通过翻译Jesse Liberty的博客来提高自己,同时也希望通过这样和大家一起学习. 原文地址:http://silverlight.net/blogs/jesseliberty/archive/2008/10/21/sizing-in-silverlight-pixels-and-stars.aspx 注:Star翻译为比例缩放,找了几本字典,

学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

Silverlight中内置了对于HTML.客户端脚本等的支持.很多情况下,我们编 写的Web应用程序中用了一些JavaScript或者AJAX框架,我们希望能够在 Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行, 这时就需要用到在Silverlight中调用JavaScript,本文将简单介绍这一内容. 使用GetProperty获取脚本对象 先来看一个简单的例子,在Silverlight测试页面中放入一个div用作显示信 息: <div id=&quo

学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

Silverlight中内置了对于HTML.客户端脚本等的支持,本文为如何在 Silverlight 2中与HTML DOM交互第二部分.在第一部分中主要介绍了如何访问 和修改已有的HTML DOM,我们还可以完全创建一个新的DOM元素或者移除一个已 有的DOM元素,除此之外,我们还可以为DOM元素添加事件处理. 创建DOM元素 首先我们来看如何创建一个新的DOM元素,最终的效果如下,当我们在文本框 中输入文字后,单击创建,将在上面的区域中创建一个li元素. 先来定义一下HTML页面,甚至Sil

学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)

Silverlight中内置了对于HTML.客户端脚本等的支持,本文为如何在 Silverlight 2与HTML DOM进行交互第一部分,访问和修改DOM元素. 访问DOM元素 我们先来看一个简单的示例,如何访问HTML DOM.最终完成的效果如下,我 们将在界面放置两个div,分别为div1和div2,下面绿色的区域为Silverlight部 分,在第一个文本框中输入div的id并点击显示,将在下面显示出对应div上的文 本信息. 首先我们需要对测试页做一下修改,因为默认的Silverlig