问题描述
我正在尝试使用C#和OpenTK创建2D游戏。对于引擎部分,我大致遵循this tutorial。在尝试添加纹理批处理之前,一切都按预期进行。那时我得到了第一个ExecutionEngineException(EEE)。现在,即使我使用更改之前的代码,也可以获得EEE。仅在以下情况下解决:
一旦我将矩阵或其他顶点属性传递给着色器,就会引发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进行注释,来将更多的顶点属性传递给着色器。 中也从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。为每个回调创建私有字段,即使这是一个静态方法也为我解决了这个问题。