Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3中的平滑60fps帧速率独立运动_Actionscript 3_Flash_Actionscript_Frame Rate - Fatal编程技术网

Actionscript 3 AS3中的平滑60fps帧速率独立运动

Actionscript 3 AS3中的平滑60fps帧速率独立运动,actionscript-3,flash,actionscript,frame-rate,Actionscript 3,Flash,Actionscript,Frame Rate,我很难在AS3中以60fps的速度实现与帧速率无关的运动。每一帧我测量上一帧之后的时间,将其添加到累加器中,如果累加器大于我的目标时间,即16.666ms(60fps),则模拟一帧 问题是AS3 getTimer()只返回以毫秒为单位的时间 我得到的增量时间通常是第一帧16ms,第二帧16ms,第三帧18ms,这种模式重复。平均为16.666。但在第一帧中,它低于目标时间(16

我很难在AS3中以60fps的速度实现与帧速率无关的运动。每一帧我测量上一帧之后的时间,将其添加到累加器中,如果累加器大于我的目标时间,即16.666ms(60fps),则模拟一帧

问题是AS3 getTimer()只返回以毫秒为单位的时间

我得到的增量时间通常是第一帧16ms,第二帧16ms,第三帧18ms,这种模式重复。平均为16.666。但在第一帧中,它低于目标时间(16<16.666),因此不模拟任何帧。在第二帧中,累加器高于目标时间,但略小于目标时间的两倍,因此模拟了一帧。对于第三帧,18ms将累加器推到目标时间的两倍,因此模拟了两帧

所以我得到了一个非常急促的运动,没有帧被渲染,然后是一帧,然后是两帧,然后是零帧,然后是一帧,然后是两帧,然后继续


我该怎么解决这个问题呢?

哇。。。我想我是唯一一个发现这一点的人

是的,AS3中的计时器类不准确。它只会每16毫秒触发一次,有时会导致重大问题

如果希望在1000毫秒内看到2048个动作:

(要测试这一点,您需要一个执行时间为1ms的方法-仅用于偶数统计)

请注意区别:

正确:1000ms |计时器=0==1000个动作

AS3:1000ms |计时器=0==62.5动作

我能够编写一个这样的类:

正确:1000ms |计时器=0==1000个动作

重塑计时器:1000ms |计时器=0==1024个动作

注:

  • 它不会每毫秒触发一次动作

  • 它能赶上16ms间隔之间的动作

  • 一个动作(我使用它的方式)是一个方法调用,每个方法调用都可以有自己的主体

  • 我用来创建这个的方法是追赶。。。基本上,第一个计时器事件将在16毫秒时触发。。。我们知道,在计时器类再次启动之前,我们有整整16毫秒的代码时间来启动我们自己的操作-这就是注入子操作的地方

    我能完成的最高动作是1000毫秒内的2048个动作每毫秒超过2次动作

    现在。。。回到你的问题上来 无法触发0毫秒计时器事件。根据我的解决方案,如果你想在计时器启动前绕过前16毫秒的延迟。。。根据当前系统进程,您可以调度将在2ms内触发的事件

    可能的解决方案
    如果您采用我的方法在16ms内抛出自己的操作,那么您可以构建自己的计时器类。触发时,将事件用于16ms以下的时间。。。再发射15次-哈哈。基本上,你可以在16毫秒之间创建你自己的增量。

    我建议阅读这篇文章:为什么你使用定时器而不是事件。输入帧?