一个普通的System大体是这样的:
public class SampleSystem : ComponentSystem
{
public struct Data
{
public readonly int Length;
public ComponentDataArray<A> As;
public ComponentDataArray<B> Bs;
}
[Inject] private Data m_Data;
protected override void OnUpdate()
{
for (int index = 0; index < m_Data.Length; ++index)
{
var aaa = m_Data.As[index].Value;
...
}
}
}
根据上章说的组件的内存布局,我们可以想象一下System调用Update前,要给m_Data这个字段注入满足条件的值所需要的信息,以上面的SampleSystem为例,其需要两个组件A和B,那么我们只需要知道当前所有的Archetype中有哪些包含有A,B组件的即可,然后注入时遍历这个满足条件的Archetype列表里所有的Chunk给CompoentDataArray使用。注意这里并不是把Chunk里所有的组件值拷贝到该ComponentDataArray中,这样就太低效了,我们只需要在访问具体值时跳转到对应的Chunk和值的指针就可以了,具体是由ComponentDataArray和ComponentChunkIterator类配合完成的,ComponentDataArray重写了索引符操作,即在m_Data.As[index