我用C#编写游戏编程,并且我使用SoA模式来处理性能关键组件。
以下是一个例子:
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>
会非常模糊)。
所以我想听听自动注意的想法&#34;注射&#34;这些数组可以减少极大量的样板代码。
答案 0 :(得分: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
}
但它并不完美(必须通过分配来完成),但至少实现子类,您不必覆盖处理数组的所有基类方法。值得做或不做取决于你有多少相似的方法。
答案 1 :(得分:0)
我建议定义一个由类使用的所有数组的集合,然后在循环中对它们进行所有必要的操作。