Sync points(同步点)
同步点(sync point)是程序执行中的一个点,它等待到目前为止已经安排好的所有作业完成。同步点限制了你在一段时期内使用作业系统中所有可用的工作线程的能力。因此,一般来说,你应该以避免同步点为目标。
Structural changes(结构性变化)
同步点是由当有任何其他工作对组件进行操作时,你不能安全地执行的操作引起的。ECS中数据的结构变化是造成同步点的主要原因。以下所有的都是结构性变化:
- 创建实体
- 删除实体
- 向实体添加组件
- 从一个实体中删除组件
- 改变共享组件的值
广义上讲,任何改变实体原型的操作或导致一个块内的实体顺序改变的操作都是结构性变化。这些结构性变化只能在主线程上执行。
结构上的改变不仅需要一个同步点,而且也会使对任何组件数据的所有直接引用失效。这包括DynamicBuffer的实例和直接访问组件的方法的结果,如ComponentSystemBase.GetComponentDataFromEntity。
Avoiding sync points(避开同步点)
你可以使用实体命令缓冲区(ECB)来排队等待结构变化,而不是立即执行它们。存储在ECB中的命令可以在帧中的稍后位置回放。这就把分散在帧中的多个同步点减少到ECB回放时的一个同步点。
每个标准的ComponentSystemGroup实例都提供一个EntityCommandBufferSystem作为该组中第一个和最后一个更新的系统。通过从这些标准ECB系统之一获得ECB对象,该组内的所有结构变化都发生在框架的同一时刻,从而产生一个同步点,而不是几个同步点。ECB还允许你记录一个作业内的结构变化。如果没有ECB,你只能在主线程上进行结构变化。即使在主线程上,在ECB中记录命令,然后回放这些命令,通常比使用EntityManager类本身逐一进行结构性改变要快)。
如果您不能为一项任务使用EntityCommandBufferSystem,请尝试将任何进行结构性更改的系统按系统执行顺序分组。两个同时进行结构性改变的系统如果按顺序更新,只会产生一个同步点。
关于使用命令缓冲区和命令缓冲区系统的更多信息,请参阅实体命令缓冲区。