我正在尝试对游戏进行多线程处理以提高性能,但之前从未做过任何大容量的多线程处理。考虑我这方面的新手。
该游戏包含大量复杂的生物,它们之间经常相互互动,并与周围的世界互动,从而改变了它们食用的植物,它们攻击的生物,它们产生的后代等的状态。我想并行化它们的Update()调用,包括它们相互更改的变量。
为了弥补我的经验不足,我一直在尝试着遵循一个简单的模板,这样我就不必再处理线程相关问题的噩梦了。
public class EntityStateChangeBuffer
{
object stateLock;
private int myVar1;
public int MyVar1
{
set
{
lock(stateLock)
{
myVar1 = value;
}
}
internal get
{
lock (stateLock)
{
return myVar1;
}
}
}
private int myVar2;
public int MyVar2
{
set
{
lock(stateLock)
{
myVar2 = value;
}
}
internal get
{
lock (stateLock)
{
return myVar1;
}
}
}
}
public class EntityState
{
object stateLock;
public int MyVar1 { get; private set; }
public int MyVar2 { get; private set; }
public void Update(EntityStateChangeBuffer changeBuffer)
{
// Apply external changes recieved from other threads
MyVar1 = changeBuffer.MyVar1;
MyVar2 = changeBuffer.MyVar2;
//Do internal state change work
MyVar1++;
MyVar2--;
changeBuffer.MyVar1 = MyVar1;
changeBuffer.MyVar2 = MyVar2;
}
}
此代码将存储在游戏其余部分的单独程序集中,并在获取中添加内部修饰符。
此应该迫使我始终通过只写EntityStateChangeBuffer来以安全的方式进行更改,该锁定将防止并发问题。请求这些状态更改后,将在下次State对象调用Update()时执行这些操作。
使用此模板,在从我的实体读取状态信息时,我将始终处于落后状态,但无需修改工作线程即可对其进行处理。
有什么明显的我想念的吗?