ECS基本概念 一

2023-05-16

基本概念

ECS(Entity-Component-System)由三部分组成

  • Entity:是一个id,目的是将Component逻辑地分组在一起,在源码中是一个结构体,包含一个int类型的id和int类型的版本号
  • Component:只是数据存储(没有代码逻辑的struct)
  • System:对数据进行逻辑处理,本身不含数据

我们的处理流程是创建一个Entity,包含一系列Component,然后用System来处理Component数据,比如修改Translation或者拿出使用Component数据计算的结果作为后面的流程使用

Entity

这个id是稳定的使用它们来存储对另一个Component或Entity的引用。例如,层次结构中的子Entity可能需要引用其父Entity。

查看源码如下

结构体里面包含包含一个int类型的id和int类型的版本号,唯一的目的就是标识Component 把他们串在一起
在这里插入图片描述

创建Entity

由EntityManager来创建Entity,EntityManager.CreateEntity提供了多个重载方法
在这里插入图片描述
说到Entity就不得不提EntityManager,相关的Entity操作都是由他完成的

  • 创建Entity
  • 为Entity添加关联的Component
  • 删除Entity
  • 获取相关的数据块

一个world中包含一个EntityManager实列

后面会介绍这些相关的操作

Component

Component:是一个结构体(struck),只包含数据,没有方法,不进行逻辑处理

内存分布
  • 原型(archetype):拥有相同组Component属于同一个原型(archetype)
    • 举例
      A拥有Component:Position,Ratation,Renderer,RigidBody
      B拥有Component:Position,Ratation,Renderer,RigidBody
      C拥有Component:Position,Ratation,Renderer
      A,B 就是相同的archetype,C与A,B就不是,因为C少一个Component
  • 块(Chunk)相同archetype储存在同一个内存块中,称为Chunk,每个Chunk16k大小,一系列Chunk直接是列表的形式连接起来的称之为archetypes
    • 在内存中一个archetype有多少类型component就是有多少个数组
    • 在Chunk内部是数组的形式,但是里面数据是不能保证顺序的,如有A,B,C,D 四个数据删除B会把最后一个位置补上来,也就是A,D,C.一般情况下我们不关心里面数据的顺序,正因为如此拆分到多个job线程才方便。

由于这种数据组织方式,对每一个Entity 添加或者减少component都好改变改Entity的archetype(structural change),即改Entity包含的component都需要移动到另外的archetype中,或者创建一个archetype,这些都是数据拷贝会产生消耗,这点需要注意

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

结构改变( structural change)

结构改变都会引发ECS的同步点

  • 创建Entity
  • 销毁Entity
  • 给Entity添加组件
  • 移除Entity组件
  • 修改共享组件的值

结构改变不只是同步点影响,对于数据的直接引用都将要失效如:DynamicBuffer
以及直接访问数据的方法如:ComponetSystemBase.GetComponentDataFormEntity.

同步点

同步点会等待之前的全部job任务执行完成之后,同步点也会阻止新的job执行。直到同步点任务完成,我们应该尽可能避免

  • 避免同步点
    可以使用 entity command buffers (ECB) ,在各需要(立即执行的地方)在同步点处理的任务集中起来到一个地方统一处理。ECB 在帧后面执行

后面会详细介绍ECB

Systems

ECS里面的S用来执行逻辑的地方,里面不包含数据。用于把component 数据从当前状态转换成下一个状态,如当前位置根据速度和时间更新
在这里插入图片描述
unity ECS 会自动检查项目中的System类,并在运行时实列化他们

  • 默认时在当前默认World
  • 默认在SimulationSystemGroup

World:ECS运行的一个独立环境,每个world有一个EntityManager实列,每个world触发同步点的时候不会影响另外一个
SystemGroup:系统更新组SimulationSystemGroup 是其中之一,后面会介绍

(系统类型)System types

ECS提供了好几种不同的类型的System一般我们的逻辑使用的继承SystemBase还有一些特殊目的的类型

  • SystemBase:system 基类
  • EntityCommandBufferSystem:在SystemGroup 每个类型在开始和结束都提供一个,主要用来解决同步点的问题
  • ComponentSystemGroup: 提供控制不同System之间的执行顺序,ECS 默认提供了基本的3个Group
  • GameObjectConversionSystem:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ECS基本概念 一 的相关文章

随机推荐

  • STM32之按键作为外部中断控制led灯

    基础概念 STM32F4 的每个 IO 都可以作为外部中断的中断输入口 xff0c 这点也是 STM32F4 的强大之处 STM32F407 的中断控制器支持 22 个外部 中断 事件请求 每个中断设有状态位 xff0c 每个中断 事件都有
  • STM32在HARDWARE文件下添加xx.c文件,新建xx.c和xx.h文件

    步骤如下 xff1a 新建text 在HARDWARE文件夹下新建time文件夹放 c 和 h文件 text文件下用Ctrl 43 S保存text文件到刚刚建立的time文件夹下 xff0c 命名time c KEIL5里面右键HARDWA
  • Word占用CPU很高?如何解决?已完结

    事件原因 xff1a 这几天在写近代史的论文 xff0c 发现一打开文档 xff0c 电脑的风扇就嗡嗡嗡转个不停 xff0c 打开任务管理器一看 好家伙 xff01 xff01 xff01 这里说明一下 xff1a 我的电脑要是不联机的话
  • 手把手教你做stm32简易串口上位机(接收数据用)

    笔者的开发板是正点原子的stm32F103zet6迷你板 串口的使用是USART1 单片机相关串口的程序就不讲解 xff0c 编写上位机程序是使用C 43 43 语言 xff0c 在VS2017里面编写 xff0c 下面进入正题 一 相关知
  • K66芯片解锁/J-link报错的解决思路

    错误呈现 xff1a 错误描述 xff1a Protection bytes in flash at add 0x400 0x40F indicate that readout protection is set For debugger
  • mpv官方文档部分快捷键

    mpv github官方快捷键文档 xff1a https github com mpv player mpv blob master etc input conf 以下是来自我个人的翻译 常规 q xff1a 退出mpv且不记住播放进度
  • STM32报错解决:..\OBJ\LED.axf: error: L6002U: Could not open file ..\obj\main.o: No such file/

    出现这个问题的原因主要有MDK的安装路径为中文 xff0c 或电脑的用户名为中文 xff0c 解决方法见如下的链接 xff1a 常规的原因 也有出现语法错误导致的 xff0c 如下面这位博主的情况 语法错误 而我遇到这个问题的原因比较难以确
  • Numpy二维数组遍历与二维数组切片后遍历效率比较

    在python numpy使用中 xff0c 可以用双层 for循环对数组元素进行访问 xff0c 也可以切片成每一行后进行一维数组的遍历 代码如下 xff1a span class token keyword import span nu
  • STM32外部中断给AB相编码器计数异常处理

    现象 楼主想实现的功能是使用编码器来实现电机旋转固定的圈数 xff0c 做一个位置闭环 在电机排线 xff08 电源线 43 编码器线 xff09 为30cm时 xff0c 计数正常 xff0c 当线长到40cm时会出现无法到达指定的位置
  • LINUX绑定usb设备名称

    LINUX绑定usb设备名称 起因 xff1a USB转TTL串口通信模块 xff0c USB摄像头模块连接linux电脑时 xff0c 其端口号一般是ttyUSB0 ttyUSB1 ttyUSB2 或video0 video1 video
  • KEIL中查看程序的存储空间的大小

    Program Size Code 61 86496 RO data 61 9064 RW data 61 1452 ZI data 61 16116 Code是代码占用的空间 xff0c RO data是 Read Only 只读常量的大
  • Mysql安装教程5.7(理论通用)

    1 首先在官网下载 mysql 地址 2 下载完成解压 默认在 C Program Files MYsQL 我下面统一使用该地址 想安装到 D 盘就提前建个文件夹命名为 MYSQL 解压进去 3 在MYSQL安装目录下 xff08 C Pr
  • Debia安装和配置dns服务

    首先下载dns服务 接着查看本机的ip地址 xff08 本机为172 16 100 201 之后统一为此ip xff09 设置本地的主服务器地址 xff0c 本机即是主服务器 xff0c 如在其他设备上在这里将namserver修改成其他设
  • Debian安装和配置chrony服务器

    首先准备两台或者两台以上debain进行配置 服务器 apt install chhrony nano etc chrony chhrony conf 添加以下内容 server 172 16 100 201 iburst 此处是chron
  • 锂电池充电(TP4056A芯片)电路分享

    描述 xff08 资料来源文档 特点 封装 引脚功能 应用电路分享 检测电池温度 xff0c 电池温度异常指示和充电状态指示应用 适合需要充电状态指示 xff0c 但不监测温度 xff08 左边 xff09 xff0c 既不需要充电状态提示
  • 利用snapper实现archlinux的系统还原

    首先 xff0c 安装snapper和btrfs progs pacman S snapper btrfs progs 创建配置文件 snapper c cfg home create config f btrfs home snapper
  • --secure-file-priv为Null且修改无效问题

    试过很多方法 xff0c 发现修改无效的根本原因是我的my ini在data文件夹中 xff0c 应该放在有效文件夹里 在命令行输入 mysql help 发现有这样一行 它的意思是c盘或者D Program Files MySQL mys
  • 在python利用代码进行简单的数学运算

    在这里我们会简单说一下在python中用代码进行数学运算 python的运算顺序 和数学里是一样的 xff1a 加减乘除 xff0c 在键盘上加减符号都有 xff0c 而乘除我们用星号 和正斜杠 表示 xff0c 次方用 表示 比如2的三次
  • Linuxshell脚本之菜单以及函数

    目录 一 菜单 1 查看菜单格式 2 简单菜单小脚本 二 函数 1 作用 2 基本格式 3 查看函数 4 删除函数 5 函数的返回值 6 函数的传参数 7 函数变量的作用范围 8 递归 三 数组 1 定义数组格式 2 数组类型包括 四 总结
  • ECS基本概念 一

    基本概念 ECS xff08 Entity Component System xff09 由三部分组成 Entity 是一个id xff0c 目的是将Component逻辑地分组在一起 xff0c 在源码中是一个结构体 xff0c 包含一个