Я смотрю на попытку многопоточности моей игры для повышения производительности, но никогда ранее не выполнял многопоточность в столь значительном объеме.Считай меня новичком на эту тему.
В игре представлен большой список сложных организмов, которые часто взаимодействуют друг с другом и окружающим миром, изменяя состояния растений, которые они едят, существ, на которых они нападают, потомство, которое они производят, и т. Д. Я хочу распараллелить ихВызовы 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;
}
}
Этот код будет сохранен в отдельной сборке для остальной части игры, тогда как внутренние модификаторы на get.
This должен заставить меня всегда вносить изменения безопасным способом, через EntityStateChangeBuffer только для записи, блокировка в котором предотвратит проблемы параллелизма.После того, как эти изменения состояния будут запрошены, они будут действовать в следующий раз, когда объект State вызовет Update ().
Используя этот шаблон, я всегда буду позади, когда дело касается чтения информации о состоянии из моих сущностей., но смогу работать над ним, не изменяя его из рабочих потоков.
Есть ли что-то очевидное, что мне не хватает?