ECS框架文档翻译十二 Accessing entity data

以下文档均来源于ECS官网:

https://docs.unity3d.com/Packages/com.unity.entities@0.0/manual/ecs_entities.html

访问实体数据

遍历数据是应用ECS系统时最常见的任务之一。ECS系统通常一次性处理一组实体,从每个实体的一个或多个组件读取数据,然后执行计算,然后将结果写入另一个组件。

通常来说,遍历实体和组件的最有效方法,就是在并行化的Job中按顺序处理它们。这样得益于可以利用多个CPU核心的处理能力,另外,由于数据的局部化(data locality),可以避免CPU的缓冲miss率(cache miss)。

{
译者注:关于数据局部化和减少缓存miss率
目前而言,多核CPU的每个内核,一般有独立的一级、二级缓存,可能存在多核共享的三级缓存。直接访问一级缓存的速度最快,二级次之,三级最差,每级缓存的命中率约为前一级的80%,由于级别越靠前,制造工艺越复杂,因此容量也越小,典型一到三级缓存的大小为:64k、256K、8M。
每一级缓存内部,被划分为多个Cache Line,举例来说,某种一级缓存内部CacheLine为64个字节,这是它每次与内存交换数据的最小单位,也就是说,当向缓存请求一份数据而为发现时,缓存会从主内存中拷贝从数据起始的连续64个字节到一个不常用的CacheLine中。由于这样的机制,在多个核心的各自缓存中,会同时存储了来自于同一份主内存的数据,这些数据已经局部化(数据局部化)。由于一、二级缓存是独立的原因,因此访问它们对于所在的CPU核心来说是局部的(空间局部化),访问速度最快。由于ECS的内存布局是连续分布的,而这正好得益于CacheLine的连续拷贝机制,因此能大大降低缓存的Miss率。
}

ECS API提供了许多遍历的方法,每种方法都有自己的性能影响和限制。您可以通过以下方式遍历ECS数据:

  • IJobForEach —逐个实体处理组件数据,最简单有效方法。

  • IJobForEachWithEntity — 比IJobForEach稍微复杂一些,使您可以访问正在处理的实体句柄,以及实体所在数组的下标。

  • IJobChunk —  用于遍历包含多个匹配实体的连续内存块(称为Chunk)。您的Job Execute()函数可以使用for循环遍历每个块内的单元。您可以将IJobChunk用于比IJobForEach所支持的更复杂的情况,同时还能保持最高效率。

  • ComponentSystem — ComponentSystem提供了Entities.ForEach委托函数,以帮助遍历实体。然而,此ForEach函数只能在主线程上运行,因此通常来说,此遍历方法应该仅用于那些必须在主线程上执行的任务。

  • 手动遍历 —如果以上的方法都不能满足你的要求,你可以手动遍历实体或者块。例如,您可以获取一个NativeArray,其中包含了你需要处理的实体或实体块,然后使用Job(例如IJobParallelFor)对其遍历处理。

EntityQuery 类提供了一种构建数据视图的方法,它通过给定的算法或过程筛选出你所需的特定数据。上面列表中的许多遍历方法都使用了EntityQuery,无论是显式的还是内部的。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值