1

以固定的时间间隔对帧更新和物理计算进行渲染计算是一种常见的做法。我不明白如何在 Ash 中做到这一点。我见过的所有游戏对象示例都只使用一个ITickProvider(可能是 FixedTickProvider 或 FrameTickProvider),它engine.update()在每个刻度上调用。例如,如果我想以 60 fps 的速度更新我的渲染系统,但以固定的时间间隔更新游戏逻辑,以防出现延迟怎么办?

tickProvider = new FrameTickProvider( container );
tickProvider.add( engine.update );
tickProvider.start();

一些想法...

  • 我可以单独更新系统组吗?
  • 我应该使用2个引擎吗?
4

1 回答 1

0

在不输入关于 ash 框架的具体考虑因素的情况下,有很多方法可以处理物理和图形引擎更新,这些方法不一定取决于您使用的框架。首先,除非您正在制作仅针对具有足够硬件要求的设备的 AIR 移动应用程序,否则您不能假设稳定的 60fps 帧率(或任何稳定的帧率)。这为您提供了多种选择:

  • 使用固定的 delta t 更新物理引擎,在这种情况下,任何错过的帧都会减慢游戏物理速度。不是很好

  • 测量最后一帧之间的实际增量 t 并相应地更新物理引擎以补偿前一帧的延迟。在大多数情况下这应该足够了

  • 如果由于某种原因您的物理引擎需要固定增量( 例如updatePhysic(1/30); ,给出的结果 与始终是 1/60 实现的倍数,您应该累积其余部分以进行下一次更新)updatePhysic(1/60); updatePhysic(1/60);updatePhysic(dT);for(var i:int = 0; i< dT * 60; ++i) updatePhysic(1/60);

  • 如果您需要最佳性能和多核 CPU 的最佳使用,您可以考虑在单独的工作人员中更新物理引擎,但 Flash 播放器支持、调试工具和工作人员之间的数据共享仍处于试验阶段!

无论如何,我看不出有什么意义

我想以 60 fps 更新我的渲染系统,但以固定的时间间隔更新游戏逻辑,以防出现延迟?

因为如果存在“滞后”,则意味着显示不会以 60 fps 更新,即使是(如果您在单独的工作人员中执行物理),它也会再次显示相同的帧。

总而言之,您可能需要比图形引擎“更快”地运行物理引擎,但绝不会相反。

此外,在动作脚本中,您不能比实际帧速率更快地触发滴答声:对 Timer、setTimeout、setInterval... 的任何调用最多将与显示同步,但永远不会更快,这就是您必须调用物理引擎的原因在主循环中手动几次,而不是仅仅将滴答声设置为 60 fps

于 2014-03-19T14:38:55.117 回答