M.a*_*jad 3 .net c# pinvoke ode-library
有人试过BEPU Physic Engine吗? http://bepuphysics.codeplex.com/
它是一个用C#编写的完全托管的物理引擎......我知道它主要用于XNA(XBOX和WP7项目),因为不允许使用非托管代码.
但我想知道的是如何将完全托管的物理引擎与Windows环境中的P/Invoked One(例如tao.ODE)进行比较(在性能方面)?
换句话说,哪个方法在Real Project中围绕非托管引擎(如ODE或PhysX)进行更多开销,完全托管代码或P/Invoke Wrapper?
我不能评论具体的物理引擎,但是我可以提供一些编写高性能代码(非托管和托管)的经验.
几年前,我研究了一个用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#开发的效率,我觉得它值得!
最好的祝福,