OpenTK:GLFW.PollEvents上的System.ExecutionEngineException

问题描述

我正在尝试使用C#和OpenTK创建2D游戏。对于引擎部分,我大致遵循this tutorial。在尝试添加纹理批处理之前,一切都按预期进行。那时我得到了第一个ExecutionEngineException(EEE)。现在,即使我使用更改之前的代码,也可以获得EEE。仅在以下情况下解决

  • 我只使用一个RenderBatch
  • 我不将视图和投影矩阵以及其他顶点属性传递给着色器

一旦我将矩阵或其他顶点属性传递给着色器,就会引发EEE。

有时我也有一个System.AccessViolationException,但是找不到受控的环境来一致地重新创建它。

可以找到源代码here。主要问题文件RenderBatch.cs,该错误发生在Window.cs的第95行。 该程序当前处于不会崩溃的状态。

可以在Renderer.cs的第六行使用maxBatchSize常数控制GameScene.cs的渲染量,而在RenderBatch.cs的第21和22行(迭代量)可以控制RenderBatch的数量。当所有现有的RenderBatch都已满时,将创建一个新的RenderBatch。当前创建了10000个GameObject。 maxBatchSize控制一个RenderBatch中可以容纳多少个GameObject。

通过取消对RenderBatch.cs中的行87和88进行注释,可以将视图和投影矩阵传递给着色器,并且可以通过将行21中的注释与未注释的行72至75和75进行注释,来将更多的顶点属性传递给着色器。

enter image description here

中也从158到161。

对于我正在使用的环境:

  • Visual Studio社区2019 16.7.5
  • 带有.NET Core 3.1的C#8.0
  • OpenTK 4.0.0
  • System.Drawing.Common 4.7.0
  • .NET SDK 5.0.100-rc.1.20452.10,但从未卸载最新的稳定版本
  • Windows 10专业版

解决方法

我现在解决了这个问题。

我在GLFW之后设置了GLFW的错误回调之后,从Init而不是之前,从GLFW得到了错误日志。该错误日志对应于找到的here。为每个回调创建私有字段,即使这是一个静态方法也为我解决了这个问题。