簡體   English   中英

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

[英]Managed Vs Unmanaged Physics Engines for C#

有人試過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頻繁運行時,他們會感到驚訝。 C ++中的newdelete也會帶來性能損失,所以不要指望C ++編譯能讓事情變得更快。

回到您的特定引擎 - 您當然必須自己進行一些測試和性能分析。 關於平台調用,當指針和結構在托管/非托管邊界上編組時,它確實會導致稱為thunking的性能損失。 純托管代碼不會有這個,但它也會錯過優化,例如低級內存拷貝,SSE / SSE2擴展等......可以用C ++編碼。

最后,我將說一個非常強大和快速的托管 - >平台調用庫的示例,請看一下SlimDX 好吧,你的性能會超過本機代碼和DirectX(一些消息來源說~5%),但是為了提高C#開發的生產效率,我覺得它值得!

最好的祝福,

但我想知道的是如何將完全托管的物理引擎與Windows環境中的P / Invoked One(例如tao.ODE)進行比較(在性能方面)?

兩者都很糟糕 - 這些天獲得真正高性能的唯一方法不是“處理器代碼”中的“非托管”,而是“運行在顯卡上”的“非托管”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM