有人试过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?
答案 0 :(得分:5)
我无法对特定的物理引擎发表评论,但是我可以提供一些编写高性能代码(非托管和托管)的经验。
几年前,我研究过一个用Delphi编写的移植到.NET的仿真软件(在我到达之前我可能会说)。它是用于质谱仪模拟的纯托管代码和计算离子轨迹。代码涉及数值积分,微分,N体静电荷计算,所以当然是在测试CPU。
我通过各种实验发现,试图找到最高性能,一些C ++版本的仿真例程可以被优化的C#代码打败。
通过良好优化,我的意思是减少新运算符(重用对象),缓存,对象池,尽可能使用结构,尽可能减少方法调用,将方法调用移动到static
/ {{1在可能的情况下,最小化传递给方法的参数数量,在发行版中编译,x64,与调试器分离。一旦我完成了这个,实际上使用C ++击败CLR我不得不采用低级技术,如SSE / SSE2和内联汇编程序。
好的,我承认,C#和托管语言与经验丰富的手动优化的C ++代码不相匹配,但我看到两个平台上的代码都没有得到优化。当C#代码很慢时,很容易责怪CLR但是当开发人员随意使用sealed
运算符时,我发现奇怪的是,当GC频繁运行时他们会感到惊讶。 C ++中的new
和new
也会影响性能,因此不要指望C ++编译只会让事情变得更快。
回到您的特定引擎 - 您当然必须自己进行一些测试和性能分析。关于平台调用,当指针和结构在托管/非托管边界上编组时,它确实会导致称为thunking的性能损失。纯托管代码不会有这个,但它也会错过优化,例如低级内存拷贝,SSE / SSE2扩展等......可以用C ++编码。
最后,我要说的是一个非常强大和快速的托管 - &gt;平台调用库的示例,请查看SlimDX。好吧,你的性能会超过本机代码和DirectX(一些消息来源说~5%),但是为了提高C#开发的生产效率,我觉得它值得!
致以最诚挚的问候,
答案 1 :(得分:1)
但我想知道的是如何将完全管理的物理引擎与P / Invoked One进行比较(For Windows环境中的示例tao.ODE(在性能方面)?
两者都很糟糕 - 这些天获得真正高性能的唯一方法不是“处理器代码”中的“非托管”,而是“在显卡上运行”中的“非托管”。