这种多线程模式是否可以防止初学者自己引起问题?

时间:2018-10-09 03:06:32

标签: c# multithreading xna monogame

我正在尝试对游戏进行多线程处理以提高性能,但之前从未做过任何大容量的多线程处理。考虑我这方面的新手。

该游戏包含大量复杂的生物,它们之间经常相互互动,并与周围的世界互动,从而改变了它们食用的植物,它们攻击的生物,它们产生的后代等的状态。我想并行化它们的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()时执行这些操作。

使用此模板,在从我的实体读取状态信息时,我将始终处于落后状态,但无需修改工作线程即可对其进行处理。

有什么明显的我想念的吗?

0 个答案:

没有答案