Flash Player的fps最大值

做项目时遇到一个很令人纠结的问题:在IE下,将fps设置为40,然后会发现两帧之间的interval在16ms和32ms之间跳动,十分不稳定,无法保持稳定的25ms,导致物体位移位置不够精确。
在网上找了些资料,最后翻到了这篇古老的文章,学到了一些与Flash Player相关的细节。
不同形式的Flash Player拥有不同的最大帧率,这取决于插件的内部实现。像IE里的FP插件,受IE浏览器对其的限制,插件的clock发出timer事件的频率最快也只有一秒60次,所以FP插件可能最大帧率也只有60fps,也就是说,两帧之间的时间差最大为16ms。对于独立的Flash Player,接收的是直接来自系统的timer信号,往往频率会很高,fps甚至能跑到120左右。

结合“40 fps下frame interval在16ms和32ms左右波动”基本可以猜测出IE下的FP的FPS相关逻辑是如何实现的:收到底层的timer事件后对自身时间值进行累积,超过设定的frame时刻就启动帧的enterframe、跑代码、渲染等各种逻辑。真正执行逻辑的时候都是在收到底层timer信号的时间点上,而往往不是真正的理想中的frame刷新时刻。这也就基本解释了为什么frame interval会在16ms和32ms之间波动。

对于开发者而言,这种实现形式可能造成的结果是,每两帧之间的流逝时间可能不尽相同,所以如果开发对时间精度要求比较高的游戏,逻辑可以写在enterframe里,但是位移之类的东东,要像Tweenlite的实现一样,根据当前的时间进行计算,而不是简单的每帧增加一些位移(这样会导致视觉上的“卡”)。

Starling框架之MovieClip用法初探

关于播放控制:
starling.display.MovieClip并没有flash.display.MovieClip中诸如gotoAndPlay和gotoAndStop之类的用法,取而代之的是如下几种方法:
1、play()
从当前帧开始播放
2、pause()
停止动画播放,保留当前帧
3、stop()
停止动画播放,并且将当前帧置0
4、 set currentFrame()
设定当前帧
与flash.display.MovieClip的比较:
flash.display.MovieClip优势在于流媒体播放,play()的时候是可以边加载边播的,这种特性导致了难于使用程序精准地控制MovieClip的TimeLine,难于使用程序改变MovieClip每帧的内容;
而starling.display.MovieClip优势在于使用stage3D加速2D的播放,但其所受到的根本限制是需要提前准备好每一帧的Texture,正是这一限制,或者说是特性,决定了它可以提供API设置每帧的播放时间、动态改变每一帧的内容,为游戏开发者提供了更多的灵活性。