Unity Entity Component System 1 --- 核心概念

英文文档地址:https://docs.unity3d.com/Packages/com.unity.entities@0.1/manual/index.html

翻译进行中

Overview

Entity Component System

Entity Component System 是Unity面向数据的技术栈(技术栈:一系列相关技术集合)。它有三个概念:

· Entities -- 实体,构成游戏或者程序

· Components -- 实体相关的数据,按照数据组织,这于面向对象的按照对象组织不同。

· Systems -- 将数据从当前状态转换到下个状态,例如,一个系统可能根据实体的速度,时间间隔来更新所有会移动的实体。

Core ECS

ESC concepts

Entity Component System (ECS) 架构划分成标识(Entity:实体),数据(Component:组件),行为(System:系统),该架构将关注点放在数据上。系统收集所有相同组件的实体的数据,并对数据进行处理。如下图:

 

在该图中,一个系统读取Translation和Rotation组件,将它们相乘并更新到相应的LocalToWorld组件中。

实体A和B还拥有Renderer组件,C没有,但这不影响系统,因为系统不关心Renderer组件。(你也可以实现一个需要Renderer的系统,该系统会忽略实体C;或者,可以实现一个排除Renderer的系统,该系统会忽略A,B。)。

Archetypes

多个Component类型的组合,被叫做(Archetype)原型。例如,一个3D对象可能包含表示世界位置的Component,线性移动的组件,旋转,和显示组件。每个这样的3D对象是一个单独的实体,但是因为它们共享了组件集合,可以说它们是同一个原型的实体:

 

该图,实体A,B共享原型M,实体C是原型N。

可以在运行时,通过添加,或者删除组件,来改变实体的原型,例如,可以将实体B的Renderer组件删除,则B将于C共享原型N。但是我们不建议这样做,会导致效率上的损失。

内存块

实体的原型决定了它的组件是如何存储的。ArchetypeChunk类对象,定义了一个原型内存块,所有相同原型的实体内存都由该对象管理。如果一个内存块满了,会分配一个新的同样原型的内存块。为实体添加或者删除组件,会改变实体的原型,这会导致实体组件从一个内存块拷贝到新的原型的内存块中。

 

该组织图展示了原型和内存块之间的一对多的关系。这意味着查找由特定组件集合的实体时,只需要遍历相关原型的实体集合,而不需要遍历所有实体。

实体的组件并不是按照特定顺序存储的(无序的)。当一个实体添加到原型,会被存储到第一个有剩余空间的内存块。内存块内的组件管理保持紧密的排列,即,当实体移除时,最后一个实体的组件,会被移动到新腾出的空间,以保持数据在内存中的连续性。

Entity queries

通过使用EntityQuery,来指定系统要处理哪些Entity。EntityQuery在原型中搜索符合需要的实体。可以指定的匹配条件:

· All – 原型必须包含指定的所有的组件

· Any – 原型至少包含指定的组件中的一个

· None – 原型不能包含指定的组件

EntityQuery返回包含符合组件匹配条件的内存块的列表。通过IJobChunk遍历这些内存块内的组件,或者IJobForEach,或者非Job的(自己写的)foreach循环。

IJobChunk时ECS特有的Job。

Jobs

为了利用多线程,可以使用Unity Job System。ECS提供了JobComponentSystem,对应Job类型,提供了IJobForEach和IJobChunk,来将数据交给工作线程处理。IJobForEach以及IJobForEachWithEntity是最简单的用法。IJobChunk可以用来处理更加复杂IJobForEach无法处理的情况。

ECS Jobs 通过Entity Query来确定要处理那些组件,以及这些组件数据是只读的,还是读写的。读写属性可以确定哪些Job可以并行执行,哪些必须按照顺序执行(确定Jobs依赖)。读取同样数据的Jobs可以同时执行,当有Job对该数据有读写属性时,该数据将不能被多个Jobs同时执行,只能顺序执行。

顺序执行的Jobs的顺序,取决于你如何设置Jobs的依赖关系。ECS调用Job Component System的OnUpdate()接口时,会传入一个JobHandle参数,该参数定义了现有Jobs的依赖。调度Job时,Job会返回一个新的JobHandle,包含了新的Job依赖。

System Organization

ECS系统组织,由World及World中的Group构成。默认的,ECS创建一个预定义Group集合的World。找到所有的System,实例化它们,把它们加到默认World的预定义的simulation group中。

在同一个Group中,可以指定System的更新顺序。Group也是一种System,所以,你可以将以个Group添加到另一个Group中并指定过呢更新顺序。一个Group中的所有的System更新完成后,再更新下一个Group的Systems。如果不指定顺序,System将以一种确定的方式添加,而不是创建顺序。也就是说,再不指定顺序的情况下,同一个Group中的所有的Systems总是以同样的顺序执行。

Entity component buffer systems

System的更新是在主线程中进行的,然而,系统可以在Jobs中将工作分配到其它线程。JobComponentSystems提供了一种简单的方法来创建和调度Jobs

ECS Authoring

在Unity中创建游戏或者应用是,可以继续使用GameObjects和MonoBehaviours,可以通过一种转换系统将它们映射到entities。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值