我无法评论特定的物理引擎,但是我可以提供一些编写高性能代码(非托管和托管)的经验。
几年前,我开发了一个用 Delphi 编写并移植到 .NET 的模拟软件(我可能会说是在我到来之前)。它是用于质谱仪模拟的纯托管代码和计算离子轨迹。该代码涉及数值积分、微分、N 体静电荷计算,因此肯定是在测试 CPU。
我通过各种试图找到最高性能的实验发现,某些 C++ 版本的模拟例程可以被优化良好的 C# 代码击败。
优化的意思是减少新的运算符(对象的重用)、缓存、对象池、尽可能使用结构、尽可能减少方法调用、将方法调用移动到static
/sealed
尽可能地减少传递给方法的参数数量,在 x64 版本中编译,与调试器分离。完成此操作后,要真正使用 C++ 击败 CLR,我不得不求助于 SSE/SSE2 和内联汇编器等低级技术。
好吧,我承认,C# 和托管语言无法与经验丰富的手工优化的 C++ 代码相匹敌,但我在这两个平台上都看到了优化不佳的代码。当 C# 代码运行缓慢时,很容易责怪 CLR,但是当开发人员随意使用new
运算符时,我发现奇怪的是,当 GC 运行如此频繁时,他们会感到惊讶。new
而delete
在 C++ 中也会对性能造成影响,所以不要指望 C++ 编译只会让事情变得更快。
回到您的特定引擎 - 您当然必须自己进行一些测试和性能分析。关于平台调用,当指针和结构跨托管/非托管边界编组时,它确实会导致性能下降,称为 thunking。纯托管代码不会有这个,但它也会错过优化,如低级内存复制、SSE/SSE2 扩展等......可以用 C++ 编码。
最后我会说一个非常强大和快速的托管->平台调用库的例子,看看SlimDX。好的,您将在本机代码和 DirectX 上获得性能提升(一些消息来源说约为 5%),但对于使用 C# 开发的生产力优势,我认为这是值得的!