我在版本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;
}
}
有解决方法吗?一些消息来源表明它是一个链接器问题,工具包库在构建之后被修改。简而言之,它可以修复,还是应该恢复到旧版本(看起来没有吸引力)?
答案 0 :(得分:1)
实际上,OpenTK 1.1包含一个基于'calli'指令的新绑定机制,这在常规C#中是不可用的。优点是,与使用委托或DllImports相比,它们允许我们提高性能并降低内存消耗。 (OpenTK 1.1在5K对象中消耗500KB内存,而OpenTK 1.0中30K对象消耗1500KB。)
当然,缺点是我们需要将OpenTK.dll作为后期构建事件进行后处理。如果您使用预编译的二进制文件或从源代码编译OpenTK.dll,这不是问题,但如果将.cs文件直接包含在项目中,则会使其更复杂。
三种解决方案,按优先顺序排列:
根据您在项目中嵌入.cs文件的原因,某些方法可能比其他方法更有意义。我个人遵循方法#1,因为它是迄今为止最简单,最通用的选择:
如果需要,可以在OpenTK下载中包含monolinker的副本。