Entitas--ECS框架插件
ECS
Entity、Component、System
- Entity
- Component
- System
模块解耦
守望先锋 https://gameinstitute.qq.com/community/detail/114516
从描述的状态 Component 上,不同的观察者会看见不同的行为,拆分不同System出来分别实现。
内存连续
通过合理组织数据利用 CPU 的缓存机制来加快内存访问数据。
举个例子,当在 Unity 中实时更新若干个 Monster 和 Player 的坐标时,往往是在 Update 中实现 transform.position = new Vector(1,2,3),即需要加载数据是 Position,但是却把整个 Transform 数据加载进内存,更高几率造成 Cache Miss;此外,对应 Monster 和 Player 的 Update 生命周期更是不可控,导致加载的数据不久后就失效,一定概率造成 Cache Miss。
上面例子中对数据的处理方式对 Cache 不友好,也对 CPU 访问内存的时间局部性不友好。


Entitas
Component
Unity Component 包括数据和行为。
ECS Component 单纯包括数据。



System
Entitas 中的 System 等价于方法。

System 存在以下四种类型:
| System 类型 | 实现功能 | Unity 相似函数 |
|---|---|---|
| Initialize System | 初始化功能 | Unity Awake |
| IExecute System | 每帧更新功能 | Unity Update |
| Reactive System | 触发式更新功能 | Unity OnCollider 等 |
| TearDown System | 析构功能 | Unity OnDestory |
其中 Reactive System 比较特别,主要实现是通过 Group + Collector 组成,通过监听特定 Component 来处理对应的 Entity,并且在之后清除对应的 Entity,避免需要每帧处理大量数据。

Entitas 跟 Unity 交互
Unity 通过脚本构建对应的 Entity,并添加对应的 Entity Component 来传递消息,经过 Entitas 处理数据后通过监听函数返回 Unity。



录像回放机制
由于 Entitas 本身是严格时序控制,调用方在保证浮点数误差,随机数等一致的情况下,对于同一个输入源,其输出结果也是一致的。
因此记录输入源即可模拟整个运算过程,有些类似魔兽争霸3的录像机制。

性能

通过图片可以看出,Entitas 在性能上要优于 Unity。
- reactive 标签表示通过开启 Reactive System 处理。
- non reactive 标签表示不通过 Reactive System 处理。
- Job System 标签表示通过开始线程处理。
关闭 Reactive System
Entitas 中如果某个 Component 通过 ReplaceXXX 函数赋值,则 Reactive System 会收集到对应的 Entity,如果通过 XXX 直接赋值,则 Reactive System 不会收集到对应的 Entity,从而节省 CPU 处理消耗,但是在实际应用中,不会专门绕开 Reactive System。
对象池
Entitas 通过尽可能复用所有对象来提高性能,减少内存分配时间和碎片。
- 复用 Entity
- 复用 Component
- 索引 Components
- 索引 ComponentValue( EntityIndex )
- 复用 Groups
ECS 编写模式为在 System 中处理一批相同 Component 类型的 Entity,导致每次处理某个特定值时,需要检查全部相同类型 Component 的 Entity,因此引入 EntityIndex 以高效地定位拥有某个具体 Component 值的 Entity。
Job System
Entitas Job System 跟 Unity Job System 实现方式不一致,其中Entitas Job System 是通过手动开辟新的 Thread。

Entitas--ECS框架插件的更多相关文章
- Unity下的ECS框架 Entitas简介
最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...
- Unity3D框架插件uFrame实践记录(一)
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- Android Studio开发快速创建MVP框架插件AndroidMVP
转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...
- Unity3D框架插件uFrame实践记录(二)
5.创建属性和命令 本小节主要内容包括: 在Element节点上创建属性数据 在Element节点上创建命令数据 5.1.在Element节点上创建属性数据 在这里,我们首先为Login节点中的属性( ...
- Rafy 框架 - 插件级别的扩展点
本章说明如何使用额外的插件(如客户化插件)对另一插件(如产品插件)进行扩展. 使用场景 在 产品线工程 中,项目的研发分为领域工程和应用工程.这个过程中会需要对领域工程中的内容进行大量的扩展. ...
- Mybatis框架插件PageHelper的使用
在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计 ...
- JAVA各种框架插件常用端口:redis、MySQL、rabbitmq、elasticsearch、tomcat等等
默认端口号 应用 21 FTP(文件传输) 22 SSH(安全登录).SCP(文件传输).端口重定向 23 Telnet(远程登录) 80 HTTP服务器 1433 SQL Server数据库serv ...
- 神奇的框架插件jquery layer
layer 的这个相册功能是不是很炫酷,是滴,这就是layer,只要添加一个layerjs就行了 //Javascript代码 layer.photos({ photos: '#photosDemo' ...
- unity游戏开发之entitas框架
框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...
随机推荐
- 数据库学习之五--Union, Union All和Intersect
一.定义 Union操作符用于合并两个或多个SELECT语句的结果集: 注:1. Union连接的Select语句之间必须拥有相同数量的列: 2. 列也必须拥有相似的数据类型: 3. 每条 SELEC ...
- 51nod 3 * problem
1640题意:一张无向图在最小化最大边后求最大边权和 Slove:sort 最小生成树倒叙最大生成树 #include <iostream> #include <cstdio> ...
- LibreOJ #115. 无源汇有上下界可行流
二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...
- Java监听器listener的介绍
Java监听器listener的介绍 listener 能做什么 当web中某些动作发生之后,服务器就调用listener中对应的方法. 内部机制 接口回调 Web监听器 步骤 创建需要的监听器类,实 ...
- jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译)
jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译) 博主亲自翻译. 大家多多捧场. 更多资源请点击"查看TA 的资源" .全场通通 2积分. htt ...
- Java类的变量初始化顺序
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...
- GO- 使用JSON
1 json.Marshal 把对象转换为JSON的方法 原型如下 func Marshal(v interface{}) ([]byte, error)这个函数接收任意类型的数据 v,并转换为字节 ...
- 【零基础】神经网络优化之Adam
一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以 ...
- 2018-2019-2 20165209 《网络对抗技术》Exp9: Web安全基础
2018-2019-2 20165209 <网络对抗技术>Exp9: Web安全基础 1 基础问题回答和实验内容 1.1基础问题回答 (1)SQL注入攻击原理,如何防御? 原理:SQL注入 ...
- Spring boot 集成Solr
首先安装Solr 集成 ikanalyzer ,可以参考 https://www.cnblogs.com/lick468/p/10867492.html https://www.cnblogs.com ...