2017-02-27 2 views
0

私はC#でゲームをプログラミングしていますが、パフォーマンスが重要なコンポーネントにはSoAパターンが使用されています。C#での配列の構造 - 定型文のコード書込みを減らす

public class ComponentData 
{ 
    public int[] Ints; 
    public float[] Floats; 
} 

理想的には、私は他のプログラマが唯一の(上記のように)、このデータを指定し、それを行うことがしたいと思います:

は、ここでの例です。しかし、いくつかの操作等、、、コピーを割り当てる成長のように、各配列のために行われなければなら今私はそうのように、それらを実装するための抽象メソッドと抽象クラスを使用しています:

public class ComponentData : BaseData 
{ 
    public int[] Ints; 
    public float[] Floats; 

    protected override void Allocate(int size) 
    { 
     Ints = new int[size]; 
     Floats = new float[size]; 
    } 

    protected override void Copy(int source, int destination) 
    { 
     Ints[destination] = Ints[source]; 
     Floats[destination] = Floats[source]; 
    } 

    // And so on... 
} 

これが必要ですプログラマーは、新しいコンポーネントを書き込むたびに、そして新しい配列を追加するたびに、この定型コードをすべて追加します。

テンプレートを使って考えてみましたが、これはAoSパターンではうまくいきますが、SoAにはあまり効果がありません(Data : BaseData<int, float>は非常に曖昧です)。

私はこれらの配列をどこかに自動的に "注入"して、定型コードを極端に減らすことを考えています。

答えて

0

私は、クラスで使用されているすべての配列のコレクションを定義し、すべての必要な操作をサイクルごとに行うことをお勧めします。

+0

わかりません。少なくとも同じ量のコードを書くのではないでしょうか? – jesta

1

考え方は以下の通りであった:

public abstract class ComponentData : BaseData 
{ 
    public Collection<Array> ArraysRegister { get; private set; } 

    public int[] Ints; 

    public float[] Floats; 

    public ComponentData() 
    { 
     ArraysRegister = new Collection<Array>(); 
     ArraysRegister.Add(this.Ints); 
     ArraysRegister.Add(this.Floats); 
     /* whatever you need in base class*/ 
    } 

    protected void Copy(int source, int destination) 
    { 
     for (int i = 0; i < ArraysRegister.Count; i++) 
     { 
     ArraysRegister[i][destination] = ArraysRegister[i][source]; 
     } 
    } 
    /* All the other methods */ 
} 

public class SomeComponentData : ComponentData 
{ 
    // In child class you only have to define property... 
    public decimal[] Decimals; 

    public SomeComponentData() 
    { 
     // ... and add it to Register 
     ArraysRegister.Add(this.Decimals); 
    } 
    // And no need to modify all the base methods 
} 

それは(何かが配分で行う必要があります)しかし、完璧ではないが、少なくとも実装する子クラスで使用すると、ベースのすべてのメソッドをオーバーライドする必要はありません配列を扱うクラスです。それは価値があるかどうかは、どれくらいの類似の方法があるかによって異なります。

+0

私は参照してください。これは実際には本当に良いです!コピー貼り付けの苦労の大部分を解決します。ありがとう! – jesta

+0

) – Aleksei

関連する問題