OpenTK GameWindow NotImplementedException

时间:2014-03-03 19:42:31

标签: c# opentk

我在版本1.1(稳定版本)中获得NotImplementedException,源代码已包含在程序中,并且在没有资源的情况下未编译为OpenTK.dll(单个文件应用程序)。

我以前做过这个,但没有使用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 个答案:

答案 0 :(得分:1)

实际上,OpenTK 1.1包含一个基于'calli'指令的新绑定机制,这在常规C#中是不可用的。优点是,与使用委托或DllImports相比,它们允许我们提高性能并降低内存消耗。 (OpenTK 1.1在5K对象中消耗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。
  4. 根据您在项目中嵌入.cs文件的原因,某些方法可能比其他方法更有意义。我个人遵循方法#1,因为它是迄今为止最简单,最通用的选择:

    • 升级更新的OpenGL API变得轻而易举(使用nuget或手动复制新的dll)
    • monolinker将OpenTK.dll降低到190-550KB,具体取决于我使用的功能。相比之下,OpenTK 1.0为2900KB,OpenTK 1.1为3800KB。

    如果需要,可以在OpenTK下载中包含monolinker的副本。