2014-03-03 46 views
0

我在版本1.1(穩定版本)中獲得NotImplementedException,源已包含在程序中,而沒有編譯爲OpenTK.dll(單個文件應用程序)而沒有資源。OpenTK GameWindow NotImplementedException

我以前做過這個,但不能與1.1版本:

public GameWindow(int width, int height, GraphicsMode mode, string title, GameWindowFlags options, DisplayDevice device, 
         int major, int minor, GraphicsContextFlags flags, IGraphicsContext sharedContext) 
     : base(width, height, title, options, 
       mode == null ? GraphicsMode.Default : mode, 
       device == null ? DisplayDevice.Default : device) 
    { 
     try 
     { 
      glContext = new GraphicsContext(mode == null ? GraphicsMode.Default : mode, WindowInfo, major, minor, flags); 
      glContext.MakeCurrent(WindowInfo); 
      (glContext as IGraphicsContextInternal).LoadAll(); 

      VSync = VSyncMode.On; 

      //glWindow.WindowInfoChanged += delegate(object sender, EventArgs e) { OnWindowInfoChangedInternal(e); }; 
     } 
     catch (Exception e) 
     { 
      Debug.Print(e.ToString()); 
      base.Dispose(); 
      throw; 
     } 
    } 

有沒有辦法解決?一些消息來源指出,這是一個鏈接器問題,工具包庫在構建之後被修改。總之,它可以被修復,還是應該恢復到舊版本(這看起來沒有吸引力)?

回答

1

事實上,OpenTK 1.1包含一個基於'calli'指令的新綁定機制,這在常規C#中是不可用的。與使用代理或DllImport相比,它的優點是它們允許我們提高性能並降低內存消耗。 (OpenTK 1.1在5K objets中消耗500KB內存,而OpenTK 1.0中的30K對象中消耗1500KB)

不利的一面是,我們需要將OpenTK.dll作爲後構建事件進行後處理。如果您使用預編譯的二進制文件或從源代碼編譯OpenTK.dll,這不是問題,但如果將.cs文件直接包含到項目中,則會使其更加複雜。

三種解決方案,按優先順序:

  1. 而是包括在項目中的.cs文件,使用ilmergeilrepack到編譯OpenTK.dll嵌入到你的可執行文件。作爲獎勵,您可以使用monolinker將尺寸減小一個數量級(見下文)。
  2. 包含.cs文件並運行Generator.Rewrite作爲生成後事件。重寫器只會觸摸標記爲[AutoGenerated]的代碼,因此您的代碼應該是安全的。添加後構建事件需要一些努力,並會稍微增加構建時間,但它仍然是一個可行的選擇。
  3. 還原爲OpenTK 1.0。

根據您在項目中嵌入.cs文件的原因,某些方法可能比其他方法更有意義。我個人遵循的辦法#1,因爲它是迄今爲止最簡單和最通用的選項:

  • 升級爲新的OpenGL的API成爲一件輕而易舉的事(使用的NuGet或手動複製新的DLL)
  • monolinker降低OpenTK。根據我使用的功能,將下載到190-550KB。爲了比較,OpenTK 1.0是2900KB,OpenTK 1.1是3800KB。

如果您需要它,OpenTK下載中會包含monolinker的副本。