1

我最近开始了一个项目,构建一个物理引擎。我希望你能给我一些与一些文档和/或最好的技术相关的建议。

首先,我已经看到强烈建议将Game-Physics-Engine-Development用于手头的任务,我想知道您是否可以给我第二个意见。我应该接受吗?另外,在浏览亚马逊时,我偶然发现了 游戏引擎架构,因为我想为游戏构建我的物理引擎,所以我认为这也可能是一本好书。

其次,我知道模拟物理是高度计算密集型的,所以我想使用 CUDA 或 OpenCL。现在我倾向于 OpenCL,因为它适用于 NVIDIA 和 ATI 芯片组。你们有什么建议?

PS:我将在 Linux 上用 C++ 实现这个。

谢谢。

4

2 回答 2

10

我建议首先计划一个简单的游戏作为你的引擎的测试用例。拥有基本游戏将推动功能和 API 开发。在没有明确目标的情况下编写引擎会使项目风险更大。虽然我同意出于性能原因应将 nVidia 和 ATi 视为单独的目标,但我建议您从两者都开始。

我亲自为 Uncharted:Drake's Fortune(一款 PS3 游戏)编写了物理引擎,并且我在 C++ 中进行了一次测试,当它运行时,通过了一次测试以针对 VMX 对其进行优化,然后将其放到 SPU 上。请注意,由于时间限制,我只做了我最初想做的一小部分。之后,我进行了一次迭代,将数据阶段拆分并制定了数据转换管道。这很重要,因为无论是 CPU、GPU 还是 SPU,运行非平凡代码的现代处理器大部分时间都在等待缓存。您必须特别注意数据结构并将它们流水线化,以便在任何阶段都拥有少量工作数据集。例如,首先我做的是broadphase,所以我不需要形状,但我需要世界空间边界框。因此,我将边界框拆分为单独的数组,并在另一遍中将它们一起计算,以最佳方式将它们写出来。作为 bbox 计算的输入,我需要形状转换和它们的一些界限,但不一定是整个形状。在broadphase之后,我计算/更新sim island,同时执行narrow phase,我确实需要这些形状。等等 - 我在一篇文章中用图片描述了这一点我写的游戏物理珍珠。

我想我想说的是以下几点:

  1. 确保您有一个明确的目标来推动您的开发 - 一个非常基本的游戏,带有冲洗设计的游戏将是游戏物理引擎案例中的最佳选择。
  2. 在你有一个可以工作的产品之前,不要试图优化。首先以最简单和最快的方式编写它,并修复数学中的所有错误。设计它以便您以后可以将其移植到 CUDA,但不要在屏幕上滚动显示框之前开始编写 CUDA 内核。
  3. 在您用 C++ 编写第一遍之后,针对 CPU 对其进行优化:对其进行优化以使其不会破坏缓存,并划分代码以便没有意大利面条式的调用,并且每个阶段的所有代码都已本地化。这将有助于 a) 移植到 CUDA b) 移植到 OpenCL c) 移植到控制台 d) 使其运行速度相当快 e) 可以调试。
  4. 在开发过程中,抵制去做你刚刚想到的事情的诱惑,除非该功能对于你的明确目标不是必需的(参见#1)——这就是为什么你需要一个目标,引导你朝着它前进,并使完成实际项目成为可能. 分心通常会扼杀没有明确目标的项目。
  5. 请记住,以一种或另一种方式,软件开发是迭代的。做一个粗略然后改进它是可以的。皮革,冲洗,重复 - 这是程序员的口头禅:)

提供建议很容易。如果你想做某事,就去做吧,我们会坐下来批评:)

于 2011-08-13T07:59:07.643 回答
1

这是关于选择 CUDA 或 OpenCL 的答案。我没有推荐书。

如果您想在 NVIDIA 和 ATI 芯片组上运行您的程序,那么 OpenCL 将使这项工作变得更容易。但是,您将需要编写每个内核的不同版本以在每个芯片组上获得良好的性能。例如,在 ATI 卡上,您需要使用 float4/int4 数据类型手动对代码进行矢量化(或接受近 4 倍的性能损失),而 NVIDIA 更适合使用标量数据类型。

如果你只针对 NVIDIA,那么 CUDA 编程起来会更方便一些。

于 2011-04-17T17:32:52.083 回答