struct AoSData
{
public int a; //a[1] AoSData[100]
public int b;
public int c;
public int d;
}
struct SoAData
{
public NativeArray<int> aArray; // aArray[100] SoAData[1]
public NativeArray<int> bArray;
public NativeArray<int> cArray;
public NativeArray<int> dArray;
}
如果你的访问是顺序访问,那么 SOA 通常比 AOS 效率高一些。特别是当你的程序在 GPU 上运行的时候,因为 Coalescing
如果你的访问是随机访问,那么 AOS 常常比 SOA 更好。因为随机访问的一个粒子的数据在 AOS 下是在同一个 cacheline 中,而在 SOA 布局下会分散在 N 个 cachelines 里面,对于 AOS 的 cacheline utilization(缓存行利用率)会高很多。
内存对齐与分配释放
因为随意分配的地址可能addr % p != 0 (p等于8 / 16 / 等等), 所以我们一般的做法是先分配一个比申请空间稍大的空间, 然后将这个头地址, 往前移动几个字节, 使得新的addr满足 % p = 0