问题描述: 在OpenTK中,如果将对象从不同的线程添加到字典中,可能会导致该对象没有被渲染。
解决方法:
using System.Collections.Concurrent;
using OpenTK.Graphics.OpenGL;
ConcurrentDictionary renderObjects = new ConcurrentDictionary();
private void AddRenderObject(int id, RenderObject obj)
{
renderObjects.TryAdd(id, obj);
}
private void Render()
{
// 渲染字典中的对象
foreach (var kvp in renderObjects)
{
RenderObject obj = kvp.Value;
// 渲染对象
obj.Render();
}
}
using System.Collections.Generic;
using System.Threading;
using OpenTK.Graphics.OpenGL;
Dictionary renderObjects = new Dictionary();
object renderObjectsLock = new object();
private void AddRenderObject(int id, RenderObject obj)
{
lock (renderObjectsLock)
{
renderObjects[id] = obj;
}
}
private void Render()
{
// 渲染字典中的对象
lock (renderObjectsLock)
{
foreach (var kvp in renderObjects)
{
RenderObject obj = kvp.Value;
// 渲染对象
obj.Render();
}
}
}
在上述示例中,我们使用了ConcurrentDictionary或lock语句来确保在多线程环境下,字典的线程安全性。这样可以解决对象没有被渲染的问题。