抛开OO设计模式以在战略游戏中实现更好的表现?

时间:2018-02-08 09:46:13

标签: c# performance caching

假设我们想要出于某些原因和约束而有效地进行编程。 我们应该放弃OOP吗? 让我们用一个例子来说明

public class CPlayer{
   Vector3 m_position;
   Quaternion m_rotation;
   // other fields
}
public class CPlayerController{
   CPlayer[] players;
   public CPlayerController(int _count){
      players=new CPlayer[_count];
   }
   public void ComputeClosestPlayer(CPlayer _player){
      for(int i=0;i<players.Length;i++){
           // find the closest player to _player
      }
   }
}

如果我们将类转换为结构,我们可以利用缓存内存中的播放器数组并获得更好的性能。当我们需要在ComputeClosestPlayer函数中迭代数组时,我们知道玩家结构是连续存储的,因此在读取数组的第一个元素时可以进入高速缓存。

public struct CPlayerController{
   CPlayer[] players;
   public CPlayerController(int _count){
      players=new CPlayer[_count];
   }
   public void ComputeClosestPlayer(CPlayer _player){
      for(int i=0;i<players.Length;i++){
           // find the closest player to _player
      }
   }
}

如果我们想要获得更高的性能,我们可以将位置字段与类别分开:

public Vector3[] m_positions;

所以现在,当我们调用函数时,只有位置(每个位置12个字节)缓存在高速缓存中,而在以前的方法中,我们必须缓存占用更多​​内存的对象。

最后我不知道这是一种标准的方法,或者你避免它将某些字段与类分开以获得更好的性能并分享你的方法以获得战略游戏中最多的性能,你有很多物品和士兵

1 个答案:

答案 0 :(得分:1)

在struct或class之间做出决定真的很棘手。当类成为引用类型时,结构变为值类型。值类型按值传递,这意味着结构的内容被复制到数组,函数参数等...引用类型通过引用传递,仅表示它们的引用通过。另一个性能问题可能来自频繁装箱和取消拳击类型。

我可能不会解释得很清楚,幸运的是MSDN有一个非常好的指南here

我在guide复制的一件事是:

  

CONSIDER 定义结构而不是类的实例   类型很小,通常是短暂的或通常嵌入   在其他对象中。

     

X AVOID 定义结构,除非类型具有所有结构   以下特点:

     
      
  • 它逻辑上表示单个值,类似于基本类型(intdouble等。)

  •   
  • 它的实例大小不超过16个字节。

  •   
  • 这是不可改变的。

  •   
  • 不必频繁装箱。

  •   
     

在所有其他情况下,您应该将类​​型定义为类。