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;
}
}

有办法绕过这个吗?一些来源表明这是一个链接器问题,工具包库在构建后正在修改。简而言之,它是可以修复的,还是应该恢复到旧版本(看起来没有吸引力)?

事实上,OpenTK1.1包含了一个基于"calli"指令的新绑定机制,这在常规C#中是不可用的。其优点是,与使用委托或DllImports相比,它们可以提高性能并降低内存消耗。(OpenTK1.1在5K对象中消耗500KB内存,而在OpenTK1.0中在30K对象中消耗1500KB内存。)

当然,不利的一面是,我们需要将OpenTK.dll作为构建后事件进行后处理。如果您使用预编译的二进制文件或从源代码编译OpenTK.dll,这不是问题,但如果您将.cs文件直接包含在项目中,则会使问题变得更加复杂。

三种解决方案,按偏好排序:

  1. 不要在项目中包含.cs文件,而是使用ilmerge或ilrepack将编译后的OpenTK.dll嵌入到可执行文件中。作为奖励,您可以使用单键打印机将大小缩小一个数量级(见下文)
  2. 包括.cs文件并运行Generator.重写为生成后事件。重写器只会接触标记为[AutoGenerated]的代码,因此您的代码应该是安全的。添加一个构建后事件需要一些努力,并且会稍微增加构建时间,但这仍然是一个可行的选择
  3. 恢复到OpenTK 1.0

根据在项目中嵌入.cs文件的原因,有些方法可能比其他方法更有意义。我个人遵循方法#1,因为它是迄今为止最简单、最通用的选择:

  • 升级新的OpenGL API变得轻而易举(使用nuget或手动复制新的dll)
  • monoliker根据我使用的功能将OpenTK.dll降低到190-550KB。相比之下,OpenTK1.0是2900KB,OpenTK1.1是3800KB

如果您需要,OpenTK下载中会包含monoliker的副本。

最新更新