物理引擎所需的建议

| 我最近开始了一个项目,构建了一个物理引擎。 我希望您能给我一些有关文档和/或最佳技术的建议。 首先,我已经看到强烈建议将Game-Physics-Engine-Development用于手头的任务,我想知道您是否可以给我第二个意见。我应该理解吗? 另外,在浏览Amazon时,我偶然发现了Game Engine Architecture,并且由于我想为游戏构建物理引擎,因此我认为这可能也是一本好书。 其次,我知道模拟物理是高度计算密集型的,因此我想使用CUDA或OpenCL。现在我倾向于OpenCL,因为它可以在NVIDIA和ATI芯片组上使用。你们有什么建议? PS:我将在Linux上用C ++实现。 谢谢。     
已邀请:
这是有关选择CUDA或OpenCL的答案。我没有推荐书的建议。 如果您想同时在NVIDIA和ATI芯片组上运行程序,那么OpenCL将使这项工作变得更加容易。但是,您将需要编写每个内核的不同版本,以在每个芯片组上获得良好的性能。例如,在ATI卡上,您将需要使用float4 / int4数据类型手动对代码进行矢量化处理(或接受将近4倍的性能损失),而NVIDIA在标量数据类型上的使用效果更好。 如果您只针对NVIDIA,那么CUDA编程起来会更方便。     
我建议首先计划一个简单的游戏作为引擎的测试用例。拥有基本的游戏将推动功能和API的发展。在没有明确目标的情况下编写引擎会使项目更具风险。虽然我同意出于性能方面的考虑,应将nVidia和ATi视为单独的目标,但我还是建议您不要两者兼而有之。 我亲自为Uncharted:Drake's Fortune(一款PS3游戏)编写了物理引擎,我在C ++中通过了一次测试,当它起作用时,通过了针对VMX进行优化并将其放在SPU上的测试。请注意,由于时间限制,我只做了最初想做的一小部分。之后,我进行了迭代以拆分数据阶段并制定了数据转换管道。这很重要,因为无论是CPU,GPU还是SPU,运行非平凡代码的现代处理器都会花费大部分时间等待缓存。您必须特别注意数据结构并将其流水线化,以便在任何阶段都有少量的工作数据集。例如。首先,我要进行广义阶段,因此不需要形状,但是需要世界空间边界框。因此,我将边界框拆分为单独的数组,并在另一遍中将它们全部计算在一起,从而以最佳方式将其写出。作为bbox计算的输入,我需要形状变换和它们的一些界限,但不一定是整个形状。广相阶段之后,我计算/更新sim岛,同时执行狭窄阶段,为此我确实需要形状。依此类推-我在写给《 Game Physics Pearls》的文章中用图片描述了这一点。 我想说的是以下几点: 确保您有一个明确的目标来驱动您的开发-具有冲洗设计的非常基本的游戏将是游戏物理引擎的最佳案例。 在拥有有效的产品之前,请勿尝试进行优化。首先以最简单,最快的方式编写它,然后修复数学中的所有错误。对它进行设计,以便以后可以将其移植到CUDA,但是在屏幕上滚动方框之前,不要开始编写CUDA内核。 在用C ++编写了第一遍之后,请针对CPU对其进行优化:简化它以免破坏高速缓存,并对代码进行分区,以使调用没有意大利面条,并且每个阶段的所有代码都已本地化。这将有助于a)连接到CUDA的端口b)连接到OpenCL的端口c)连接到控制台的端口d)使它运行得相当快e)使其调试成为可能。 在开发过程中,请抗拒诱惑去做您刚想过的事情,除非该功能对于您明确的目标不是必需的(请参阅#1)-这就是为什么您需要一个目标,引导您朝着这个目标前进,并有可能完成目标实际的项目。分心通常会杀死没有明确目标的项目。 请记住,以某种方式,软件开发是迭代的。可以进行粗加工,然后进行优化。皮革,漂洗,重复-这是程序员的口头禅:) 提出建议很容易。如果您想做某事,那就去做吧,我们会坐下来批评:)     

要回复问题请先登录注册