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框架插件的更多相关文章

  1. Unity下的ECS框架 Entitas简介

    最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...

  2. Unity3D框架插件uFrame实践记录(一)

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  3. Android Studio开发快速创建MVP框架插件AndroidMVP

    转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...

  4. Unity3D框架插件uFrame实践记录(二)

    5.创建属性和命令 本小节主要内容包括: 在Element节点上创建属性数据 在Element节点上创建命令数据 5.1.在Element节点上创建属性数据 在这里,我们首先为Login节点中的属性( ...

  5. Rafy 框架 - 插件级别的扩展点

    本章说明如何使用额外的插件(如客户化插件)对另一插件(如产品插件)进行扩展.   使用场景 在 产品线工程 中,项目的研发分为领域工程和应用工程.这个过程中会需要对领域工程中的内容进行大量的扩展.   ...

  6. Mybatis框架插件PageHelper的使用

    在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计 ...

  7. JAVA各种框架插件常用端口:redis、MySQL、rabbitmq、elasticsearch、tomcat等等

    默认端口号 应用 21 FTP(文件传输) 22 SSH(安全登录).SCP(文件传输).端口重定向 23 Telnet(远程登录) 80 HTTP服务器 1433 SQL Server数据库serv ...

  8. 神奇的框架插件jquery layer

    layer 的这个相册功能是不是很炫酷,是滴,这就是layer,只要添加一个layerjs就行了 //Javascript代码 layer.photos({ photos: '#photosDemo' ...

  9. unity游戏开发之entitas框架

    框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...

随机推荐

  1. 简述 CGI、FastCGI和php-FPM的区别

    1.CGI是联系webserver 跟php解析器的一个桥梁 2.FastCGI是CGI改良的版本 3.php-FPM 是FastCGI 的进程管理器

  2. log4j2配置文件log4j2.xml详解

    配置全解 1.缺省默认配置文件 <?xml version="1.0" encoding="UTF-8"?> <Configuration s ...

  3. 十八.搭建Nginx服务器、配置网页认证、基于域名的虚拟主机、ssl虚拟主机

    配置要求: client:192.168.4.10 proxy:192.168.4.5(eth0) 192.168.2.5(eth1) web1:192.168.2.100 web2:192.168. ...

  4. bzoj 3721: PA2014 Final Bazarek 贪心

    如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...

  5. Linux操作系统常用命令合集——第一篇-文件和目录操作(40个命令)

    一.选项和参数的区别        在经过上一次的系统安装后我们已经成功登陆,登陆LInux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文名:options)或“参数” ...

  6. rdma centos 7.3安装

    rdma centos 7.3安装 corasql0人评论7680人阅读2017-05-28 16:29:40   1.安装依赖包 yum install epel-release -y   yum  ...

  7. 带你了解HTTP协议(二)

    同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍.   一图看完本文 一. 计算机网络体系结构分层   计算机网络体系结构分层   计算机网络体系结构分层 不难看出,TCP/IP 与 OSI ...

  8. P2698 [USACO12MAR]花盆Flowerpot——单调队列

    记录每天看(抄)题解的日常: https://www.luogu.org/problem/P2698 我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了: 如果横坐标(l,r)区间,纵坐标 ...

  9. Js 之cookie插件(jquery.cookie.js)

    一.代码 (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define([ ...

  10. js的鼠标右键简单菜单

    实现点击鼠标右键时出来菜单代码如下: 主要运用oncontextmenu事件,oncontextmenu 事件在元素中用户右击鼠标时触发并打开上下文菜单. <!DOCTYPE html> ...