2011-07-24 64 views
1

在問我的問題的過程中,我已經找出了我需要的答案,但我也有興趣分享我學到的知識並看到其他評論當我試圖進入二維物理學時可能會有。如何編譯和運行64位環境下的Physics2D.NET演示

我想在C#中使用2D物理引擎。我已經下載了Box2dx和Physics2D.Net。 Box2dx的演示很好地運行,但我擔心性能和編碼複雜性。所以我決定嘗試Physics2D.Net(我找不到更多信息來比較Box2dx和Physics2d.Net,但我確信Physics2D.Net基於我讀過的代碼更簡單,而且我懷疑它可能表現更好)。不幸的是,演示不會運行。當它嘗試在Windows 7 64位上運行Physics2DDemo示例程序時,我得到BadImageFormat異常。

就像我說的,我已經找到了如何讓演示運行,所以我希望你不介意我張貼,並接受我自己的答案,但有關這個話題我還是會投其他任何有益的意見如果有人有更好的答案(如「嘗試其他更好的下載」),我仍然可以選擇我自己的。

回答

1

在下載SdlDotNet的源代碼以調試到加載字體時發生的BadImageformatException的源代碼後,我發現它在嘗試初始化字體系統時發生。我爲什麼會發生這種情況的猜測是,在那裏仍然有一些32位的DLL在運行,所有.NET程序集都在64位進程中運行。所以我強制最高級別的.NET程序集來定位x86而不是Any CPU。從Visual C#2010速成做到這一點,我打開生成菜單,選擇「配置管理器」,選擇「86」作爲活動解決方案平臺,並做了一些改動,以3個項目

  • Physics2DDemo
  • Physics2DDotNet
  • Physics2DDotNet.Demo

(我大概沒有需要改變所有這些,只是Physics2DDemo改變似乎並沒有工作。這可能是因爲我需要重新打開該解決方案和/或者更強有力地重建,但它最終奏效了。)這些都是變化ES我對每個項目做:

  1. 在平臺欄中,選擇「<新建... >」
  2. 在彈出的對話框中,選擇86作爲新平臺,並選擇「任何CPU」作爲從中複製的來源。
  3. 選中「Build」框。
  4. 關閉配置管理器窗口並打開這個單獨項目的項目設置。
  5. 在「構建」選項卡上,從輸出路徑中刪除「x86」,只留下bin \ Debug。

回想起來,我想我應該檢查每個項目上的「構建」框,這可能會減少我在使項目DLL版本保持同步時遇到的一些問題。

這確實讓我過去的字體問題,但只有幾行代碼。接下來,在執行SurfaceGl的類型初始化程序時失敗。它在這條線上失敗:

static glLoadIndentityDelegate glLoadIdentity = 
(glLoadIndentityDelegate)Marshal.GetDelegateForFunctionPointer(
Sdl.SDL_GL_GetProcAddress("glLoadIdentity"), typeof(glLoadIndentityDelegate)); 

顯然SDL_GL_GetProcAddress返回0。事實證明,我爲SdlDotNet下載的代碼,比Physics2D.Net提供的代碼稍微新一些,並不適用於Physics2D.Net。我用原始DLL替換了更新後的DLL,現在我可以編譯並運行Physics2D.NET演示程序!

當然,任何人都希望將Physics2D.NET整合到純.NET引擎中,或者可以容納64位進程的應用程序可能需要構建「AnyCPU」解決方案目標而不是x86目標。將x86解決方案目標中的所有項目切換爲x86版本可能是值得的。

我注意到我現在可以切換項目目標,以便Physics2DDemo是唯一一個構建爲x86的項目。其餘的程序集,作爲DLL,將加載到該進程中,無論該進程選擇什麼。所以只強制該程序集啓動一個32位進程就足夠了。

可能有一些我在此忽略的步驟。我沒有重新加載解決方案,並強制重建若干次,以便Visual Studio與新的目標位置和版本等重新同步。但我認爲這是因爲我切換了SdlDotNet版本。所以我希望所有這些都不是必須的。

+0

而順便說一下,物理2D的性能看起來*顯着*更快。 – BlueMonkMN

0

如果得到上面的修改後「找不到文件」,

您可能還需要添加一個.. |到DATADIR中的開始,在VS2010你,當你與平臺和目標撥弄獲得目錄額外的一層......

0

我知道這是舊的,使其成爲

static readonly string dataDir = 
    @"..|..|..|..|data".Replace('|',Path.DirectorySeparatorChar); 

,但我有在Google和我搜索解決方案時遇到的同樣問題也出現在這裏,但意識到它比解決方案簡單。 我意識到它通過寫

 string dataDir = "C:\\Windows\\Fonts\\arial.ttf"; 
     font = new Font(dataDir, 40); 
     font.Bold = true; 
     font2 = new Font(dataDir, 15); 

上線97 - 100 「Demo.cs」。爲我工作。

相關問題