2

有人试过BEPU物理引擎吗? http://bepuphysics.codeplex.com/

这是一个用 C# 编写的完全托管的物理引擎……我知道它主要用于 XNA(XBOX 和 WP7 项目),因为不允许使用非托管代码。

但我想知道的是如何将完全托管的物理引擎与Windows环境中的 P/Invoked One(例如 tao.ODE)进行比较(在性能方面)?

换句话说,哪种方法在实际项目中围绕非托管引擎(如 ODE 或 PhysX)产生更多开销、完全托管代码或 P/Invoke Wrapper?

4

2 回答 2

5

我无法评论特定的物理引擎,但是我可以提供一些编写高性能代码(非托管和托管)的经验。

几年前,我开发了一个用 Delphi 编写并移植到 .NET 的模拟软件(我可能会说是在我到来之前)。它是用于质谱仪模拟的纯托管代码和计算离子轨迹。该代码涉及数值积分、微分、N 体静电荷计算,因此肯定是在测试 CPU。

我通过各种试图找到最高性能的实验发现,某些 C++ 版本的模拟例程可以被优化良好的 C# 代码击败。

优化的意思是减少新的运算符(对象的重用)、缓存、对象池、尽可能使用结构、尽可能减少方法调用、将方法调用移动到static/sealed尽可能地减少传递给方法的参数数量,在 x64 版本中编译,与调试器分离。完成此操作后,要真正使用 C++ 击败 CLR,我不得不求助于 SSE/SSE2 和内联汇编器等低级技术。

好吧,我承认,C# 和托管语言无法与经验丰富的手工优化的 C++ 代码相匹敌,但我在这两个平台上都看到了优化不佳的代码。当 C# 代码运行缓慢时,很容易责怪 CLR,但是当开发人员随意使用new运算符时,我发现奇怪的是,当 GC 运行如此频繁时,他们会感到惊讶。newdelete在 C++ 中也会对性能造成影响,所以不要指望 C++ 编译只会让事情变得更快。

回到您的特定引擎 - 您当然必须自己进行一些测试和性能分析。关于平台调用,当指针和结构跨托管/非托管边界编组时,它确实会导致性能下降,称为 thunking。纯托管代码不会有这个,但它也会错过优化,如低级内存复制、SSE/SSE2 扩展等......可以用 C++ 编码。

最后我会说一个非常强大和快速的托管->平台调用库的例子,看看SlimDX。好的,您将在本机代码和 DirectX 上获得性能提升(一些消息来源说约为 5%),但对于使用 C# 开发的生产力优势,我认为这是值得的!

于 2012-01-21T18:34:20.233 回答
1

但我想知道的是如何将完全托管的物理引擎与 Windows 环境中的 P/Invoked One(例如 tao.ODE)进行比较(在性能方面)?

两者都很糟糕 - 如今获得真正高性能的唯一方法不是“处理器代码”中的“非托管”,而是“在图形卡上运行”中的“非托管”。

于 2012-01-21T14:56:06.050 回答