游戏动画的最佳方法?

时间:2009-03-07 22:17:43

标签: graphics animation 3d

我在OpenGL中进行了一个练习,用一些简单的动画来编写游戏

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

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

一般来说,首选方法应该是什么?有没有人有任何方法的具体经验?

7 个答案:

答案 0 :(得分:10)

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

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

另外,如果你想保持稳定,可以在时间步长上使用上限/下限,如果帧需要几秒钟来渲染(由另一个进程进行光盘访问?)或跳过一个慢速运动如果你在10毫秒内得到其中两个,则更新。

<强>更新 (因为这是一个相当受欢迎的答案)

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

<强> UPDATE2 (因为我有10个upvotes;)

为了在长时间跑步(> 4小时)内获得进一步的稳定性,你可能想确保你没有使用浮点数/双打来计算大的时差,因为你失去了精确度这样做以及游戏的动画/物理会受苦。改为使用固定点(或基于64位微秒)的整数。

对于毛茸茸的细节,我建议您阅读Tom Forsyth的A matter of precision

答案 1 :(得分:4)

阅读有关游戏循环的this page

简而言之,设置一个计时器:

  • 固定频率更新游戏状态(类似于每25 ms = 1s / 40fps)。这包括游戏对象的属性,输入,物理,AI等。我称之为模型控制器。对固定更新速率的需求来自可能出现在太慢或太快的硬件上的问题(阅读文章)。一些物理引擎也更喜欢以固定频率更新。

  • 尽可能快地更新游戏的框架(图形)。这将是查看。这样你就可以提供顺畅的游戏。您还可以启用vsync,以便显示屏等待显卡(通常为60 fps)。

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

棘手的部分是,由于更新速率不同,在快速硬件中,视图将在模型和控制器之前多次更新。因此,您应该根据“游戏状态更新时的位置”插入游戏对象的位置。这真的不那么难。

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

答案 2 :(得分:1)

第二种方法是我的首选方法,因为定时器通常不如您可能想的那么准确,并且具有事件处理系统的所有延迟和开销。考虑时间间隔将使您的动画具有更加一致的外观,并且在帧速率下降时保持稳定。

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

答案 3 :(得分:1)

选项2是目前最受欢迎的。它可以在不同性能的硬件上很好地扩展。

“Game Programming Gems 1”一书中有一章涵盖了你的需求:

Frame Rate Independent Linear Interpolation

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我很想使用循环,因为它会尽可能快地渲染(即在物理计算完成后立即渲染)。如果你遇到计算中的任何减速,这可能会更加强大,这将导致计时器启动开始排队。但是,如果这种速度变慢,你可能不得不对更新之间计算的时间步长设置上限,因为你的物理引擎可能会因为跳跃时间过长而变得不稳定。

答案 6 :(得分:0)

我建议设置系统以处理从外部传入的“delta”。

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

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