注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

金融IT小鸿的博客

致力于金融IT行业

 
 
 

日志

 
 
关于我

Organize the world's information I care about and share it with other people! Change the Financial Industry through Information Technology! 爱互联网,爱金融, 爱分享,爱运动, 也爱偶尔胡思乱想! 我是金融IT小鸿

网易考拉推荐

Flash开发者应该知道的基本知识(一)  

2010-12-06 15:16:31|  分类: Flash相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       今天看了两篇不错的文章,都是讲作为Flash开发者应该知道的10个基本知识。一篇是“10 Things Every Senior Flash Developer Should Know”,这个是从比较宽泛的角度讲的,针对Flash开发者(个人认为Flash开发者是一个很宽的概念,只要你最终的成果是一个运行在Flash Player上的应用,那么你就是一个Flash开发者。即使什么代码都不写也可以是Flash开发者,使用像Flash Authoring Tool是可以不写代码开发Flash的)。另一篇是“10 Things A Good Flex Developer Should Know”,这个就针对Flex开发者了,可能这里面的东西我更加熟悉一点。
       做了快一年的Flash开发,发现里面讲得很多东西自己也都是一知半解,有的只是听说过。准备利用闲暇时间好好看看这些东西,同时也把自己的学习心得分享出来更大家交流一下,检验一下自己理解的是否完全正确。今天分享一个Flash Player的帧执行模型——可变跑道模型。在网上找到了Adobe中国员工的翻译如下:

演讲人: Lee Thomason (lthomaso@adobe.com)
翻译: 林晓伟 (xwlin@adobe.com)

上一篇我们介绍了Flash Player的代码库是如何归并一体以及对Flash平台的后期开发产生的影响,在第二节里,我们将重点讨论Flash Player的体系结构及其对开发人员的影响。

理解执行模型
执行模型是指Flash Player在每一个帧周期中如何执行相应的指令操作。Flash Player后台事实上运行着n多线程,只是AS并没有给开发人员提供多线程编程模型。这意味着从概念上来讲我们要把Flash Player看做是单线程运行实体,有关这一单线程编程模型的优势/劣势的争论从未休止过,我不想对这一具有争议性的问题做过多评论,但请大家记住这一事实。

可变跑道(Elastic Racetrack)
可变跑道是Flash Player的帧执行模型,这个模型描述了在一帧的处理周期中,代码执行和帧渲染的工作是怎样彼此平衡的。Flash Player 9和AVM2对这一模型进行了一些改进,这一信息是基于对事件机制和渲染模型的研究总结出来的,完整的模型尚未被官方公布。

基本的跑道理论没有发生改变,在Flash Player执行一帧的周期里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作,而跑道的总长度也将相应增长。


Flash开发者应该知道的基本知识(一) - IT小鸿 - IT小鸿的博客


  在前一模型基础上发生改变的是每一阶段在一个微观周期里的样子以及他们怎样形成一帧。

AVM2是由Flash Player中一个叫做Marshal的元帅级组件所操控,Marshal负责将时间切割成Flash Player工作所依的基本时间片,在这里我希望澄清一下Flash Player的时间片跟swf文件运行时的帧速率没有任何关系,我们将最终看到Flash Player是如何将这些时间片合成为一帧。在Mac OS版Firefox中执行一个由Flex编译得来的swf文件,Marshal通常会将时间切割成19-20毫秒的时间片,时间片大小根据平台和浏览器的不同而存在差异.为方便我们接下来的讨论,我们假定时间片大小为20毫秒,也就是说Marshal每秒钟会产生不超过50个时间片,每个时间片中,五步可能的操作按如下顺序执行:
 

  1. Player事件调度 – 比如Timer事件,鼠标事件,ENTER_FRAME事件,URLLoader事件等等。
  2. 用户代码执行 – 所有侦听上一步相应事件的代码被执行。
  3. RENDER事件调度 – 在用户代码执行期间调用stage.invalidate()会触发这一特殊事件。
  4. 最后的用户代码执行 – 侦听上述第三步特殊事件的用户代码此时被执行。
  5. Player更改显示列表。

Flash开发者应该知道的基本知识(一) - IT小鸿 - IT小鸿的博客


 
Marshal如此反复的执行20毫秒时间片并在运行中决定下一步操作。一个时间片中执行的所有这些操作最终归纳为上述两段式跑道(代码执行,图像渲染)也就是我们所说的一帧。用户代码和失效操作填充在代码执行区,渲染操作填充在跑道的渲染区段。需要指出的是相关操作只能在Marshal预定的时间内发生,如果你的用户代码很短,那么Marshal仍然会在执行完用户代码后等待一段时间然后进入渲染阶段。

为了更好阐述哪些action被如何执行以及可变跑道如何被创建,请参考如下示例,分别描述了以5fps, 25fps和50fps帧速率工作的swf中时间片是如何被处理的。


Flash开发者应该知道的基本知识(一) - IT小鸿 - IT小鸿的博客
 
以上示例可以看出,不同的帧速率下,一个帧周期中的可变跑道会执行不同操作,例如对于5fps的swf,每帧处理10个用户action,1个失效action,1个渲染action;帧速率25fps的swf,每帧处理2个用户action,1个失效action,1个渲染action;对于50fps的swf,每帧只能处理1个用户action,1个失效action,1个渲染action。需要指出的很重要的一点是,某些事件只可能能发生在某些特定的时间片里,比如,Event.ENTER_FRAME事件只能在某一帧的初始时间片中被调度。
  1. 一个时间片中代码部分和渲染部分都有可能过长而导致相应时间片大于20毫秒,这就是”可变”的含义,为了保证帧的播放速率仍然接近swf编译时设定的帧率,Marshal会选择丢掉一些时间片。
  2. swf文件的播放速率不可能超过当前Flash Player切割时间片的速率,你可以为swf文件设定120fps的播放速率,但Flash最多可以按照50帧的速度播放(具体数值取决于当前系统的设置)。
  3. 代码的执行频率可能比swf的帧率更高,播放一个1fps的swf文件,播放一帧时间为1秒,也就是50个时间片,但在每个时间片里,都会有触发鼠标或计时器事件,尽管只有最后一个时间片才会渲染,另外你可以选择通过调用函数updateAfterEvent() 提前渲染,但只能在鼠标,计时器和键盘事件处理函数中调用。在这种情况下,Marshal会认为当前帧已结束并从下一个时间片起进入下一帧。 最后,如果一个Sprite的外观属性比如width,height等发生变化而将鼠标从该Sprite上方掠过,Flash会进行强制渲染。
  4. 如果帧率不是每秒时间片数量的整数因子,那么该平台的渲染时间间隔将变得不固定,比如帧率20fps的swf运行在50个时间片每秒的系统上,Flash Player的行为将是每5个时间片播放两帧,那swf的渲染频率将是2-3-2-3-2-3(时间片)。

总结:其实帧率决定了舞台的渲染频率,而Flash代码的执行频率是由当前系统设置决定的,一般是不变的。之前也在Flash动画基础教程中看到过这一知识点,但是没有从Flash Player内部机制的角度解释。这次就比较清晰了,原来每一帧的执行时间可变是不完全准确的,其实根源是每一个时间片的执行时间可变,取决于代码的复杂度和渲染复杂度。


  评论这张
 
阅读(485)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017