物理引擎所需的建议

时间:2011-04-17 15:07:54

标签: cuda opencl game-physics physics-engine

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

首先,我已经看到Game-Physics-Engine-Development被强烈推荐用于手头的任务,我想知道你是否可以给我第二个意见。我应该得到它吗? 此外,在浏览亚马逊时,我偶然发现Game Engine Architecture,因为我想为游戏构建我的物理引擎,我认为这也是一个很好的阅读。

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

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

感谢。

2 个答案:

答案 0 :(得分:9)

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

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

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

  1. 确保你有一个明确的目标,推动你的发展 - 一个非常基本的游戏设计,在游戏物理引擎案例中是最好的。
  2. 在拥有可用产品之前,请勿尝试优化。首先以最简单,最快的方式编写它,并修复数学中的所有错误。设计它以便以后可以将它移植到CUDA,但是在屏幕上滚动框之前不要开始编写CUDA内核。
  3. 在C ++中编写第一个传递之后,为CPU优化它:简化它以使其不会破坏缓存,并对代码进行划分,以便不存在调用意外,并且每个阶段的所有代码都是本地化的。这将有助于a)端口到CUDA b)端口到OpenCL c)端口到控制台d)使其运行速度相当快e)使调试成为可能。
  4. 在开发过程中,抵制诱惑去做你刚才想到的事情,除非你的明确目标不需要这个功能(见#1) - 这就是为什么你需要一个目标,引导你走向它并使之成为可能实际的项目。分心通常会在没有明确目标的情况下扼杀项目。
  5. 请记住,以某种方式,软件开发是迭代的。可以粗略地进行粗化,然后进行优化。皮革,冲洗,重复 - 它是程序员的口头禅:)
  6. 提供建议很容易。如果你想做某事,就去做吧,我们会坐下来批评:)

答案 1 :(得分:1)

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

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

如果你只针对NVIDIA,那么CUDA在编程方面会更方便。