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

本文介绍Unity ECS系统的遍历方法,包括IJobForEach、IJobForEachWithEntity、IJobChunk等,探讨如何利用多核CPU和数据局部化提高游戏性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下文档均来源于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,无论是显式的还是内部的。

 

使用JPA(Java Persistence API)访问数据是一种在Java应用程序中进行对象关系映射(ORM)的常用方法。JPA允许开发者以面向对象的方式操作数据库,而不需要编写大量的SQL代码。以下是关于如何使用JPA访问数据的简要介绍: 1. **配置JPA环境**:首先,需要在项目中添加JPA的依赖库,如HibernateEclipseLink等实现。然后,在项目的配置文件(如persistence.xml)中定义持久化单元(Persistence Unit),指定使用的数据库连接信息和实体类位置等。 2. **创建实体类**:实体类是与数据库表对应的Java类,通过注解(如@Entity, @Table, @Id等)来映射数据库表和列。例如,一个简单的用户实体类可能如下所示: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "username") private String username; // getters and setters } ``` 3. **创建EntityManager**:EntityManager是JPA的核心接口,用于管理实体实例的生命周期、事务和查询等。通常,EntityManager是通过EntityManagerFactory获取的,EntityManagerFactory则根据持久化单元的配置创建。 4. **执行CRUD操作**:通过EntityManager,可以执行基本的CRUD(创建、读取、更新、删除)操作。例如,要创建一个新用户,可以使用`persist()`方法;要查询所有用户,可以使用`createQuery()`方法。 5. **事务管理**:JPA中的事务管理可以通过编程方式控制,也可以由容器(如Spring)自动管理。在编程方式下,需要手动开始和结束事务。 6. **优化和高级功能**:JPA还提供了许多高级功能,如批量处理、缓存、继承映射等,可以根据需要进行配置和使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值