我建议首先计划一个简单的游戏作为你的引擎的测试用例。拥有基本游戏将推动功能和 API 开发。在没有明确目标的情况下编写引擎会使项目风险更大。虽然我同意出于性能原因应将 nVidia 和 ATi 视为单独的目标,但我建议您从两者都开始。
我亲自为 Uncharted:Drake's Fortune(一款 PS3 游戏)编写了物理引擎,并且我在 C++ 中进行了一次测试,当它运行时,通过了一次测试以针对 VMX 对其进行优化,然后将其放到 SPU 上。请注意,由于时间限制,我只做了我最初想做的一小部分。之后,我进行了一次迭代,将数据阶段拆分并制定了数据转换管道。这很重要,因为无论是 CPU、GPU 还是 SPU,运行非平凡代码的现代处理器大部分时间都在等待缓存。您必须特别注意数据结构并将它们流水线化,以便在任何阶段都拥有少量工作数据集。例如,首先我做的是broadphase,所以我不需要形状,但我需要世界空间边界框。因此,我将边界框拆分为单独的数组,并在另一遍中将它们一起计算,以最佳方式将它们写出来。作为 bbox 计算的输入,我需要形状转换和它们的一些界限,但不一定是整个形状。在broadphase之后,我计算/更新sim island,同时执行narrow phase,我确实需要这些形状。等等 - 我在一篇文章中用图片描述了这一点我写的游戏物理珍珠。
我想我想说的是以下几点:
- 确保您有一个明确的目标来推动您的开发 - 一个非常基本的游戏,带有冲洗设计的游戏将是游戏物理引擎案例中的最佳选择。
- 在你有一个可以工作的产品之前,不要试图优化。首先以最简单和最快的方式编写它,并修复数学中的所有错误。设计它以便您以后可以将其移植到 CUDA,但不要在屏幕上滚动显示框之前开始编写 CUDA 内核。
- 在您用 C++ 编写第一遍之后,针对 CPU 对其进行优化:对其进行优化以使其不会破坏缓存,并划分代码以便没有意大利面条式的调用,并且每个阶段的所有代码都已本地化。这将有助于 a) 移植到 CUDA b) 移植到 OpenCL c) 移植到控制台 d) 使其运行速度相当快 e) 可以调试。
- 在开发过程中,抵制去做你刚刚想到的事情的诱惑,除非该功能对于你的明确目标不是必需的(参见#1)——这就是为什么你需要一个目标,引导你朝着它前进,并使完成实际项目成为可能. 分心通常会扼杀没有明确目标的项目。
- 请记住,以一种或另一种方式,软件开发是迭代的。做一个粗略然后改进它是可以的。皮革,冲洗,重复 - 这是程序员的口头禅:)
提供建议很容易。如果你想做某事,就去做吧,我们会坐下来批评:)