OpenTK.Graphics.GraphicsContextException 几秒后 运行
OpenTK.Graphics.GraphicsContextException after a few seconds of running
我得到的错误是“'OpenTK.Graphics.GraphicsContextException' 类型的未处理异常发生在 OpenTK.dll
附加信息:无法使上下文 131072 成为当前上下文。错误:0"
我四处搜索,但找不到导致它的原因,如果我想自己修复它,我不确定从哪里开始。我认为导致它的代码是:
public static Texture2D GetRectangle(int width, int height, Color colour, bool fill)
{
Color[] _rectangleData = new Color[width * height];
Color _fillColour;
if (fill)
{
_fillColour = colour;
}
else
{
_fillColour = Color.Transparent;
}
//create top
for (int x = 0; x < width; x++)
{
_rectangleData[x] = colour;
}
//create sides
for (int y = 1; y < height - 1; y++)
{
_rectangleData[y * width] = colour;
for (int x = 1; x < width - 1; x++)
{
_rectangleData[y * width + x] = _fillColour;
}
_rectangleData[y * width + (width - 1)] = colour;
}
//create bottom
for (int x = 0; x < width; x++)
{
_rectangleData[width * (height - 1) + x] = colour;
}
Texture2D texture = TextureManager.newTexture2D(width, height);
texture.SetData(_rectangleData);
return texture;
}
我调用一次来制作一个正方形,我可以用它来绘制网格。它是静态的,因为它是我用来处理纹理的 class 的一部分,所以我不会在整个项目中传递 graphicsDevice。一旦我将此方法禁用 运行 ,错误就不会出现。如果启用,它会 运行 几秒钟然后崩溃,有时 window 会变黑。我已经检查过它是否被某些东西循环导致它过载,但它只被调用过一次。
我正在使用 Empty Keys,它是基于 WPF 的 Monogame 的 GUI 库,尽管这似乎没有引起任何问题。我愿意接受为了绘制正方形而进行的更改,但我想知道是什么导致了这个问题,所以如果将来出现它,我可以处理它。
从你的代码中很难说,我想我需要看更多;但这通常是两个不同的函数从您的内容管理器访问同一对象时发生的错误。
例如;在加载屏幕上,您可能有一个线程加载精灵并将它们添加到内容管理器,而另一个线程绘制加载精灵。他们都访问了内容管理器并发生碰撞。
考虑使用锁或更好的方法:monitor.enter / monitor.exit 以保护对 TextureManager
中任何功能的访问
monitor.enter
可以有超时时间,所以你可以让它重试一下。
我得到的错误是“'OpenTK.Graphics.GraphicsContextException' 类型的未处理异常发生在 OpenTK.dll
附加信息:无法使上下文 131072 成为当前上下文。错误:0"
我四处搜索,但找不到导致它的原因,如果我想自己修复它,我不确定从哪里开始。我认为导致它的代码是:
public static Texture2D GetRectangle(int width, int height, Color colour, bool fill)
{
Color[] _rectangleData = new Color[width * height];
Color _fillColour;
if (fill)
{
_fillColour = colour;
}
else
{
_fillColour = Color.Transparent;
}
//create top
for (int x = 0; x < width; x++)
{
_rectangleData[x] = colour;
}
//create sides
for (int y = 1; y < height - 1; y++)
{
_rectangleData[y * width] = colour;
for (int x = 1; x < width - 1; x++)
{
_rectangleData[y * width + x] = _fillColour;
}
_rectangleData[y * width + (width - 1)] = colour;
}
//create bottom
for (int x = 0; x < width; x++)
{
_rectangleData[width * (height - 1) + x] = colour;
}
Texture2D texture = TextureManager.newTexture2D(width, height);
texture.SetData(_rectangleData);
return texture;
}
我调用一次来制作一个正方形,我可以用它来绘制网格。它是静态的,因为它是我用来处理纹理的 class 的一部分,所以我不会在整个项目中传递 graphicsDevice。一旦我将此方法禁用 运行 ,错误就不会出现。如果启用,它会 运行 几秒钟然后崩溃,有时 window 会变黑。我已经检查过它是否被某些东西循环导致它过载,但它只被调用过一次。
我正在使用 Empty Keys,它是基于 WPF 的 Monogame 的 GUI 库,尽管这似乎没有引起任何问题。我愿意接受为了绘制正方形而进行的更改,但我想知道是什么导致了这个问题,所以如果将来出现它,我可以处理它。
从你的代码中很难说,我想我需要看更多;但这通常是两个不同的函数从您的内容管理器访问同一对象时发生的错误。
例如;在加载屏幕上,您可能有一个线程加载精灵并将它们添加到内容管理器,而另一个线程绘制加载精灵。他们都访问了内容管理器并发生碰撞。
考虑使用锁或更好的方法:monitor.enter / monitor.exit 以保护对 TextureManager
monitor.enter
可以有超时时间,所以你可以让它重试一下。