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的实现一样,根据当前的时间进行计算,而不是简单的每帧增加一些位移(这样会导致视觉上的“卡”)。