访问实体数据
迭代数据是您在实施 ECS 系统时需要执行的最常见任务之一。ECS 系统通常处理一组实体,从一个或多个组件读取数据,执行计算,然后将结果写入另一个组件。
迭代实体和组件的最有效方法是在按顺序处理组件的可并行化作业中。这利用了所有可用内核和数据局部性的处理能力来避免 CPU 缓存未命中。
ECS API 提供了多种完成迭代的方法,每种方法都有自己的性能影响和限制。您可以通过以下方式迭代 ECS 数据:
-
SystemBase.Entities.ForEach — 逐个实体处理组件数据的最简单有效的方法。
-
IJobEntityBatch — 迭代包含匹配实体的符合条件的内存块(称为块)。作业
Execute()
函数可以使用 for 循环来迭代每个块内的元素批次。您可以将IJobEntityBatch用于比Entities.ForEach支持的更复杂的情况,同时保持最高效率。 -
Manual iteration——如果前面的方法不够用,你可以手动迭代实体或块。例如,您可以使用诸如
IJobParallelFor
迭代NativeArray
包含要处理的实体或实体块的作业。
该EntityQuery类提供一种方法来构建你的数据的视图只包含你需要一个给定的算法或过程中的特定数据。上面列表中的许多迭代方法都显式地或内部地使用EntityQuery。
重要提示:不应在新代码中使用以下迭代类型:
-
- IJobChunk
- IJobForEach
- IJobForEachWithEntity
- ComponentSystem
- JobComponentSystem
这些类型正在逐步淘汰,优先于SystemBase,一旦经过弃用周期,它们就会过时。使用SystemBase和SystemBase.Entities.ForEach或IJobEntityBatch来替换它们。