2

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

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

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

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

我将如何解决这个问题?

4

1 回答 1

1

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

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

如果想在 1000 毫秒内看到 2048 个动作FlashText 标记语言

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

注意区别:

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

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

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

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

整形定时器:1000ms | 计时器=0 == 1024 个动作

笔记:

  1. 不会每毫秒触发一次动作

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

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

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

我能够产生的最高值是 1000 毫秒内的 2048 个动作……每毫秒超过 2 个动作

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

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

于 2013-02-12T20:10:49.573 回答