我最近开始了一个项目,建立一个物理引擎。 我希望你能给我一些与一些文档和/或最佳技术相关的建议。
首先,我已经看到Game-Physics-Engine-Development被强烈推荐用于手头的任务,我想知道你是否可以给我第二个意见。我应该得到它吗? 此外,在浏览亚马逊时,我偶然发现Game Engine Architecture,因为我想为游戏构建我的物理引擎,我认为这也是一个很好的阅读。
其次,我知道模拟物理是高度计算密集的,所以我想使用CUDA或OpenCL.Right现在我倾向于OpenCL,因为它适用于NVIDIA和ATI芯片组。你们有什么建议?
PS:我将在Linux上用C ++实现它。
感谢。
答案 0 :(得分:9)
我建议首先计划一个简单的游戏作为你的引擎的测试用例。拥有基本游戏将推动功能和API开发。在没有明确目标的情况下编写引擎会使项目风险更大。虽然我同意nVidia和ATi出于性能原因应该被视为单独的目标,但我建议你从两个目标开始。
我亲自为Uncharted编写了物理引擎:Drake's Fortune - 一款PS3游戏 - 我在C ++中做了一个传递,当它工作时,为VMX做了一个优化它然后把它放在SPU上。请注意,由于时间限制,我最初做的只是我想做的一小部分。之后,我进行了迭代,将数据阶段拆分出来,并制定数据转换管道。这很重要,因为CPU,GPU或SPU,运行非平凡代码的现代处理器是否大部分时间都在等待缓存。您必须特别注意数据结构并对其进行管道处理,以便在任何阶段都有一小组工作数据。例如。首先我做宽相,所以我不需要形状,但我需要世界空间边界框。因此,我将边界框拆分为单独的数组,并在另一个通道中将它们全部计算在一起,以最佳方式将它们写出来。作为bbox计算的输入,我需要形状变换和它们的一些界限,但不一定是整个形状。在宽相之后,我计算/更新sim岛,同时执行窄相,我确实需要这些形状。等等 - 我用Game Physics Pearls写的一篇文章中的图片描述了这一点。
我想我想说的是以下几点:
提供建议很容易。如果你想做某事,就去做吧,我们会坐下来批评:)
答案 1 :(得分:1)
以下是关于CUDA或OpenCL选择的答案。我没有推荐书。
如果您想在NVIDIA和ATI芯片组上运行您的程序,那么OpenCL将使工作更轻松。但是,您需要编写每个内核的不同版本,以便在每个芯片组上获得良好的性能。例如,在ATI卡上,您需要使用float4 / int4数据类型手动向量化代码(或接受近4倍的性能损失),而NVIDIA在标量数据类型上的效果更好。
如果你只针对NVIDIA,那么CUDA在编程方面会更方便。