管理与C#的非托管物理引擎

时间:2012-01-21 14:47:04

标签: c# .net pinvoke ode-library

有人试过BEPU Physic Engine吗? http://bepuphysics.codeplex.com/

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

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

换句话说,哪个方法会在Real Project中围绕非托管引擎(如ODE或PhysX)进行更多开销,完全托管代码或P / Invoke Wrapper?

2 个答案:

答案 0 :(得分:5)

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

几年前,我研究过一个用Delphi编写的移植到.NET的仿真软件(在我到达之前我可能会说)。它是用于质谱仪模拟的纯托管代码和计算离子轨迹。代码涉及数值积分,微分,N体静电荷计算,所以当然是在测试CPU。

我通过各种实验发现,试图找到最高性能,一些C ++版本的仿真例程可以被优化的C#代码打败。

通过良好优化,我的意思是减少新运算符(重用对象),缓存,对象池,尽可能使用结构,尽可能减少方法调用,将方法调用移动到static / {{1在可能的情况下,最小化传递给方法的参数数量,在发行版中编译,x64,与调试器分离。一旦我完成了这个,实际上使用C ++击败CLR我不得不采用低级技术,如SSE / SSE2和内联汇编程序。

好的,我承认,C#和托管语言与经验丰富的手动优化的C ++代码不相匹配,但我看到两个平台上的代码都没有得到优化。当C#代码很慢时,很容易责怪CLR但是当开发人员随意使用sealed运算符时,我发现奇怪的是,当GC频繁运行时他们会感到惊讶。 C ++中的newnew也会影响性能,因此不要指望C ++编译只会让事情变得更快。

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

最后,我要说的是一个非常强大和快速的托管 - &gt;平台调用库的示例,请查看SlimDX。好吧,你的性能会超过本机代码和DirectX(一些消息来源说~5%),但是为了提高C#开发的生产效率,我觉得它值得!

致以最诚挚的问候,

答案 1 :(得分:1)

  

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

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