c# - 新的 Texture2D 和 Texture.SetData 将在大多数情况下工作,但它会导致事情挂起
问题描述
这是monogame中的错误,还是我做错了什么?
在任务/线程中运行时。它将导致 OpenGL 挂起/冻结。(在 DirectX 中工作正常)。虽然这并不总是发生。我们在程序的另一部分使用类似的代码从原始图像数据创建纹理。它在那里工作得很好,它也在一个任务/线程中。
任务创建者:
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”版本中提高性能。
推荐阅读
- python - Python matplotlib y 轴无法正常工作
- python - 如何向模型添加更多功能(标签)
- reactjs - 每月数据值,但希望每年显示 xticks chartJS
- minecraft - 如何在我的世界中制作堆肥机
- reactjs - 对段落渲染器的降价类型做出反应?
- postgresql - AWS RDS Postgres/Iam 身份验证/和行级安全性 - 多合一。这可能吗?
- python - Django:解决“找不到'password_reset_complete'的反向。”
- symfony - Symfony 服务 FileUploader 不自动装配
- javascript - 使用 v-for 时出现问题。带点的道具不显示
- python - 使用归一化迭代计数的 Mandelbrot 集