new Texture2D 和 Texture.SetData 在大多数情况下都可以工作,但它会导致事情挂起
new Texture2D and Texture.SetData will work in most cases but it's causing things to hang
这是 monogame 中的错误,还是我做错了什么?
当运行在task/thread。它将导致 OpenGL hang/freeze。 (在 DirectX 中工作正常)。尽管这并非总是发生。我们在程序的另一部分使用类似的代码从原始图像数据创建纹理。它在那里工作正常,它也在 task/thread.
任务创建者:
List<Task> tasks = new List<Task>
{
Task.Run(() => Data.TryAdd(SectionName, Dataobj.Create(new Rectangle(0, 500, (int)Size.X, 124))))
}
在 SetData
或 new Texture2D
上挂起。通过将新的 texture2d 移动到主线程中进行测试。
Texture2D localdot = new Texture2D(Memory.graphics.GraphicsDevice, 4, 4);
Color[] tmp = new Color[localdot.Height * localdot.Width];
for (int i = 0; i < tmp.Length; i++)
tmp[i] = Color.White;
localdot.SetData(tmp);
我正在等待完成的部分。
if (!Task.WaitAll(tasks.ToArray(), 10000))
throw new TimeoutException("Task took too long!");
在生成其他线程之前在主线程中创建纹理和数组。任务(线程)应该只设置数据数组,完成后,您可以在主线程中调用SetData()
。
Texture2D
构造函数和 SetData()
都不是线程安全的并且 可能 导致竞争条件;由于 Texture2D
连接到 GraphicsDevice
。
(DirectX-OpenGL) 差异很可能是由于 SharpDX(DirectX) 实现中的锁定机制造成的,这在 OpenGL 版本中不会发生。
通过采用上述策略,"DirectX" 版本可能会提高性能。
这是 monogame 中的错误,还是我做错了什么?
当运行在task/thread。它将导致 OpenGL hang/freeze。 (在 DirectX 中工作正常)。尽管这并非总是发生。我们在程序的另一部分使用类似的代码从原始图像数据创建纹理。它在那里工作正常,它也在 task/thread.
任务创建者:
List<Task> tasks = new List<Task>
{
Task.Run(() => Data.TryAdd(SectionName, Dataobj.Create(new Rectangle(0, 500, (int)Size.X, 124))))
}
在 SetData
或 new Texture2D
上挂起。通过将新的 texture2d 移动到主线程中进行测试。
Texture2D localdot = new Texture2D(Memory.graphics.GraphicsDevice, 4, 4);
Color[] tmp = new Color[localdot.Height * localdot.Width];
for (int i = 0; i < tmp.Length; i++)
tmp[i] = Color.White;
localdot.SetData(tmp);
我正在等待完成的部分。
if (!Task.WaitAll(tasks.ToArray(), 10000))
throw new TimeoutException("Task took too long!");
在生成其他线程之前在主线程中创建纹理和数组。任务(线程)应该只设置数据数组,完成后,您可以在主线程中调用SetData()
。
Texture2D
构造函数和 SetData()
都不是线程安全的并且 可能 导致竞争条件;由于 Texture2D
连接到 GraphicsDevice
。
(DirectX-OpenGL) 差异很可能是由于 SharpDX(DirectX) 实现中的锁定机制造成的,这在 OpenGL 版本中不会发生。
通过采用上述策略,"DirectX" 版本可能会提高性能。