Graphics 游戏动画的最佳方法?

Graphics 游戏动画的最佳方法?,graphics,animation,3d,Graphics,Animation,3d,我在OpenGL中有一个课程练习,用几个对象的简单动画编写一个游戏 在与我的合作伙伴讨论我们的设计选项时,我们意识到,对于动画的工作方式,我们有两个主要的选择 设置一个固定时间间隔的计时器,例如30毫秒,当计时器点击时,计算对象应该在哪里并绘制帧。或- 不要使用计时器,只是一个正常的循环,一直运行,在每次迭代中检查经过的时间,根据间隔计算对象应该在哪里,并绘制帧 通常首选的方法是什么?有人对这两种方法都有具体的经验吗?第二种方法是我比较喜欢的方法,因为计时器通常不像你想象的那样精确,并且具有

我在OpenGL中有一个课程练习,用几个对象的简单动画编写一个游戏

在与我的合作伙伴讨论我们的设计选项时,我们意识到,对于动画的工作方式,我们有两个主要的选择

  • 设置一个固定时间间隔的计时器,例如30毫秒,当计时器点击时,计算对象应该在哪里并绘制帧。或-
  • 不要使用计时器,只是一个正常的循环,一直运行,在每次迭代中检查经过的时间,根据间隔计算对象应该在哪里,并绘制帧

通常首选的方法是什么?有人对这两种方法都有具体的经验吗?

第二种方法是我比较喜欢的方法,因为计时器通常不像你想象的那样精确,并且具有事件处理系统的所有延迟和开销。考虑时间间隔将使动画的外观更加一致,并且在帧速率下降时更加健壮


话虽如此,如果您的动画基于物理模拟(例如刚体或碎布玩偶动画),那么为物理设置固定的更新间隔可以大大简化实现。

尽可能快地渲染和计算以获得最大帧速率(由垂直同步限制)

不要使用计时器,在Windows上,计时器不可靠<50-100毫秒。检查过了多少时间。(通常,您需要delta t和绝对值,具体取决于动画是基于物理还是基于关键帧。)

此外,如果您想保持稳定,请在时间步长上使用上限/下限,如果渲染一帧需要几秒钟(通过另一个进程访问光盘?),则进入慢动作,或者如果在10毫秒内获得两帧,则跳过更新

更新 (因为这是一个相当流行的答案)

我通常更喜欢有一个固定的时间步长,因为它使一切更加稳定。大多数物理引擎对变化的时间都非常健壮,但其他东西,如粒子系统或各种简单的动画,甚至游戏逻辑,在固定的时间步长内运行时更容易调整

更新2 (因为我得到了10票;)

为了在长时间运行(>4小时)中获得更高的稳定性,您可能需要确保不使用浮点/双倍来计算较大的时间差,因为这样做会降低精度,并且会影响游戏的动画/物理效果。改用定点(或基于64位微秒的)整数


关于毛茸茸的细节,我建议阅读汤姆·福赛斯的著作。

使用第二种方法。为我的高级项目做了一个游戏,根据经验,不能保证你的逻辑会在计时器想要启动时完成处理。

目前首选选项2。它将在不同性能的硬件之间进行良好的扩展

《游戏编程宝石1》一书中有一章详细介绍了您的需求:


我很想使用循环,因为它将以尽可能快的速度渲染(即在物理计算完成后立即渲染)。如果计算速度减慢,这可能会更加健壮,这会导致计时器触发开始排队。但是,如果出现这种速度减慢的情况,您可能必须对更新之间计算的时间步长设置上限,因为物理引擎可能会因时间跳变过大而变得不稳定。

我建议将系统设置为在从外部传入的“增量”上工作

当我这样做的时候,在动画格式中,我基于实时值。我传递的增量是1/30秒,但它可能是任何东西。使用此系统,您可以获得第一个或第二个选项,具体取决于您是以固定增量传递,还是以自上一帧以来经过的时间量传递

至于哪个更好,这取决于你的比赛和你的要求。理想情况下,您的所有系统都将基于相同的增量,以便物理匹配动画。如果您的游戏完全没有帧,并且您的所有系统都使用可变增量,我建议可变增量是两种解决方案中更好的解决方案,以获得最终用户体验。

了解游戏循环

简而言之,设置计时器:

  • 以固定的频率更新游戏状态(大约每25毫秒=1秒/40帧)。这包括游戏对象的属性、输入、物理、人工智能等。我称之为模型和控制器。对固定更新率的需求来自于可能出现在太慢或太快硬件上的问题(阅读本文)。一些物理引擎也喜欢以固定频率更新

  • 尽可能快地更新游戏的框架(图形)。这将是视图。这样,您将提供一个流畅的游戏。您还可以启用vsync,以便显示器等待图形卡(通常为60 fps)

因此,在循环的每次迭代中,您都要检查是否应该更新模型/控制器。如果延迟,请更新,直到它们是最新的。然后,更新帧一次并继续循环

棘手的是,由于更新率不同,在快速硬件中,视图将在模型和控制器之前更新数次。因此,您应该根据“如果游戏状态已更新,它们将位于何处”插入游戏对象的位置。其实没那么难

您可能需要维护两种不同的数据结构:一种用于模型,另一种用于视图。例如,可以为模型创建场景图,为视图创建BSP树