【问题标题】:Smooth 60fps frame rate independent motion in AS3AS3 中流畅的 60fps 帧速率独立运动
【发布时间】:2013-02-12 18:53:06
【问题描述】:

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

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

我得到的增量时间通常是第一帧为 16 毫秒,第二帧为 16 毫秒,第三帧为 18 毫秒,并且这种模式会重复。这平均为 16.666。但在第一帧中它低于目标时间(16

所以我得到了这个非常不稳定的动作,没有渲染帧,然后是一帧,然后是两帧,然后是无帧,然后是一帧,然后是两帧,然后继续。

我该如何解决这个问题?

【问题讨论】:

标签: actionscript-3 flash actionscript frame-rate


【解决方案1】:

哇...我以为只有我一个人发现了这一点。

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

如果想在 1000 毫秒内查看 2048 个动作FlashText Markup Language

(要对此进行测试,您需要一个执行时间为 1 毫秒的方法 - 仅用于统计数据)

注意区别:

正确:1000ms | timer=0 == 1000 次操作

AS3:1000 毫秒 | timer=0 == 62.5 个动作

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

正确:1000ms | timer=0 == 1000 次操作

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

注意:

  1. 每毫秒触发一次操作

  2. 确实赶上 16 毫秒间隔之间的操作

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

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

我能够在 1000 毫秒内产生的最高操作是 2048 次...每毫秒超过 2 个操作

现在...回到您的问题 没有办法触发 0ms 定时器事件。根据我的解决方案,如果您想在计时器触发之前绕过前 16 毫秒的延迟……您可以调度一个将在 2 毫秒内触发的事件,具体取决于当前系统进程。

可能的解决方案 如果您采用我的方法在 16 毫秒内执行自己的操作,那么您可以构建自己的计时器类。在 16 毫秒内使用事件,当被触发时......再触发 15 次 - 大声笑。基本上,您可以在 16 毫秒之间创建自己的增量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多