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

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

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

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

最佳答案

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

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

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

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

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

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

最后我要说一个非常强大和快速的 managed->Platform invoke library 的例子,看看 SlimDX 。好的,您的性能将超过 native 代码和 DirectX(一些消息来源称约 5%),但对于使用 C# 开发的生产力优势,我会说这是值得的!

此致,

关于c# - C# 的托管与非托管物理引擎,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8953864/

10-12 00:29
查看更多