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

本文关键字:引擎 | 更新日期: 2023-09-27 18:20:55

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

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

但我想知道的是,在Windows环境中,如何将完全托管的Physic引擎与p/Invoked引擎(例如tao.ODE)进行比较(就performance而言)?

换句话说,在真实项目中,哪种方法会产生更大的开销,完全托管代码还是围绕ODE或PhysX等非托管引擎的p/InvokeWrapper?

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

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

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

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

所谓优化,我指的是减少新运算符(重用对象)、缓存、对象池、尽可能使用结构、尽可能减少方法调用、尽可能将方法调用移动到static/sealed、尽可能降低传递给方法的参数数量、在发行版x64中编译、从调试器分离。一旦我做到了这一点,为了使用C++真正击败CLR,我不得不求助于低级别的技术,如SSE/SSE2和内联汇编程序。

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

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

最后,我要说的是,对于管理的例子->平台调用库是非常强大和快速的,看看SlimDX。好吧,比起原生代码和DirectX,你会得到性能上的提升(一些消息来源说大约5%),但从C#开发的生产力优势来看,我认为这是值得的!

但我想知道的是,完全托管的Physic引擎与p/Invoked引擎相比如何(For陶。ODE)(就性能而言)?

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