我在AS3中以60fps实现帧速率独立运动时遇到了麻烦。每帧我测量自上一帧以来的时间,将其添加到累加器,如果累加器大于我的目标时间,即16.666ms(60fps),则模拟一帧。
问题是AS3 getTimer()只返回一个以毫秒为单位的时间。
我得到的delta时间通常是第一帧16ms,第二帧16ms,第三帧18ms,这种模式重复。平均值为16.666。但是在第一帧中它低于目标时间(16 <16.666),因此不模拟帧。在第二帧中,累加器高于目标时间,但略小于它的两倍,因此模拟一帧。对于第三帧,18ms将累加器推过目标时间的两倍,因此模拟了两帧。
所以我得到了这个非常生涩的动作,没有渲染任何帧,然后是一个,然后是两个,然后是一个,然后是一个,然后是两个,这将继续。
我如何解决这个问题?
答案 0 :(得分:1)
是的,AS3中的计时器类不准确。它只会触发每个~16ms,有时会导致MAJOR问题。
如果想要在1000毫秒内看到 2048次操作:FlashText Markup Language
(为了测试这一点,你需要一个需要1毫秒才能执行的方法 - 仅用于偶数统计数据)
注意区别:
正确:1000ms | timer = 0 == 1000次动作
AS3 :1000ms | timer = 0 == 62.5动作
我能够编写一个类似这样的类:
正确:1000ms | timer = 0 == 1000次动作
RESHAPE TIMER :1000ms | timer = 0 == 1024次动作
注:
不会每隔一天触发一次动作
DOES 赶上16ms间隔之间的行动
- 醇>
一个ACTION(我使用它的方式)是一个方法调用,每个方法调用都可以有自己的主体
我用来创建这个的方法是追赶......基本上第一个计时器事件将在16ms触发......我们知道我们有一个完整的16ms的代码时间来在计时器类触发之前触发我们自己的动作再次 - 那就是你注入子动作......
我能够产生的最高值是1000秒内的2048次动作...... 每毫秒超过2次动作。
现在......回到你的问题 没有办法触发0ms定时器事件。根据我的解决方案,如果你想在定时器触发之前绕过前16ms的延迟...你可以调度一个事件,该事件将在2ms内触发,具体取决于当前的系统进程。
可能的解决方案 如果你采取我的方法在16ms内抛出自己的行为,那么你可以建立自己的计时器类。使用事件的时间不超过16毫秒,当被解雇时......再开15次 - 大声笑。基本上,您可以在16ms之间创建自己的增量。