ECS 图解

news2025/1/11 10:11:05

旧系统执行逻辑:

程序开发中有一个很经典的设计模式/框架 :MVC

vc 部分是系统, m 是组件。

我通过名为 index 的索引访问此数据:

现在该组件具有用于读取和写入该数据的数据。

看看源代码中的Entity 。 struct 结构体。 64位索引 (2个32 位 int)。

Index :

实体的ID。

进入内部实体列表的索引。

实体索引在销毁实体时被回收。 销毁实体时,EntityManager会增加版本标识符。 要表示同一实体,Entity对象的Index和Version字段必须匹配。 如果索引相同,但版本不同,则实体已被回收。

Version:

实体的世代版本。generational version

理论上,版本号可以在应用程序的生命周期内溢出和环绕overflow and wrap。 因此,您不能假设具有较大版本的Entity实例是具有较小版本(和相同索引)的实体的最新版本。 用于确定此Entity对象是否仍标识现有实体。

下图是包含内部 组件 。

ECS 也肯定有Update , 比如从t 帧到 t +1 帧

下图就是这一帧之间, 比如 Position和Rotation, Rotation和 Renderer 的两个系统处理

Job 的引入:

如果是四核机器就可以利用起来: 比如之前 JCS 任务都是在主线程上。

接下来是Burst :

https://docs.unity3d.com/Packages/com.unity.burst@0.2/manual/index.html#overview

Burst是一个编译器,它使用LLVM将IL / .NET字节码转换为高度优化的本机代码。

Burst主要用于与Job系统高效协作。

分析Burst生成的程序集: https://gametorrahod.com/analyzing-burst-generated-assemblies/

要更详细的了解这个技术? https://www.youtube.com/watch?v=QkM6zEGFhDY

获得Burst Compiler的幕后花絮。了解从称为High Performance C#的IL / .NET子集生成更好的本机代码所面临的挑战。了解如何开发和测试Burst,它可以带来什么样的优化,以及如何通过使用面向数据的编程方法在项目中利用它。您还将深入了解我们正在做些什么来改进它。演讲者:Alexandre Mutel(Unity Technologies)

ECS 游戏实践最好的是 守望先锋 GDC上的分享:

https://www.youtube.com/watch?v=W3aieHjyNvw

摩尔定律,集成电路的速度:

每24个月翻一番。 CPU以惊人的速度变得很快。 但是现在内存好像成为了瓶颈。

所以数据很重要, 具体说是数据命中高级缓存的 几率很重要。

在移动设备 怎么才能减少热量? CPU 和 GPU 计算。

只要提高性能就可以。

Demo时间, 随机生成1000个cube 比较两种方式的性能。 是否开启Burst, JobSystem 的差别。

因为是Package, 相当于开放源代码:

整体结构, 两个World之间是独立的, 不能别的World的child, 实体只是一个索引。

Archetype 我个人理解这个原型很像Prefab,通过它可以复制无限多个一模一样的副本。 类似于设计模式中的原型模式。

不一样的是, 他是一个链表。 每个单位16千字节的块(就是 Entity)。

特殊的组件 SharedComponent 共享组件。

比如实体中共享组件 AABB

对 World 的更多解释: Initialization, Simulation, Presentation 初始化,模拟,演示, 这三个是什么东西?

三个更新函数处理时机。

每个系统组都有两个缓冲区 和 一个 BIG&ENTITY命令缓冲区。

什么是命令缓冲区?

当我运行某些东西时, 它不完全时结果,而是命令

下面是系统的属性 , 在系统中可以控制顺序 ,

UpdateBeforeAttribute/UpdateAfterAttribute : 在系统之前或之后更新会限制ComponentSystemGroup中这些系统的调度程序排序。

before和after系统都必须是同一ComponentSystemGroup的成员。

下两个两个属性又会发生什么?

UpdateInGroup : 指定的Type必须是ComponentSystemGroup。

在组中更新意味着该系统将由指定的ComponentSystemGroup自动更新。

系统可以使用UpdateBegin和UpdateEnd相对于组中的其他系统进行自我排序,

没有什么可以防止系统出现在多个组中,如果有一个用例,可以添加它

在EntityDebug中可以看到顺序: 和结构:

entity 命令(Command)现在是一个实体缓存 缓冲区, 位于两端, 上图中的 CommandBuffer 结尾的。

Query List : Read Write , Read Only , Exclude

Chuck 现在是绿色和红色? 绿色表示 我要读写这些数据。

蓝色表示 领导姐妹数据, 红色是不包含在内。

Chunk Info : Archetype组成: 8 bytes 大小, PlayerComponent (4bytes)

1338是什么? 如果我将这些数据格式化16k bytes ,我会放几个? Chunk Utilization:块利用率

现在,即使你没有神奇的形状,你也会有一个名为 Entity Cache的文件夹。 这部分就像你在幕后做的那样。

即使它有库存,我也会在没有大问题的情况下重新制作它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32查看内存占用的map文件解析

STM32查看内存占用的map文件解析STM32查看内存占用的map文件解析程序内存分析在stm32中,通常堆向高地址增长(向上增长),栈向低地址增长(向下增长);1.2 flash、ROM、RAM的区别1.3 通常stm32在kei…

跨过社科院与杜兰大学金融管理硕士项目入学门槛,在金融世界里追逐成为更好的自己

没有人不想自己变得更优秀,在职的我们也是一样。当我们摸爬滚打在职场闯出一条路时,庆幸的是我们没有沉浸在当下,而是继续攻读硕士学位,在社科院与杜兰大学金融管理硕士项目汲取能量,在金融世界里追逐成为更好的自己。…

如何做好项目各干系人的管理及应对?

如何更好地识别、分析和管理项目关系人?主要有以下几个方面: 1、项目干系人的分析 一般对项目干系人的分析有2种方法, 方法一:权利(影响),即对项目可以产生影响的人; 方法二&#xf…

终端配色-Docker容器终端

20230309 - 0. 引言 平时使用SSH,通常都是使用securecrt来用,毕竟也算是之前windows下一种使用的工具,在mac下使用还算方便;进入终端后,可以通过调整配色来调整编程环境。平时经常使用屎黄色的那种配色,毕…

Spark单机伪分布式环境搭建、完全分布式环境搭建、Spark-on-yarn模式搭建

搭建Spark需要先配置好scala环境。三种Spark环境搭建互不关联,都是从零开始搭建。如果将文章中的配置文件修改内容复制粘贴的话,所有配置文件添加的内容后面的注释记得删除,可能会报错。保险一点删除最好。Scala环境搭建上传安装包解压并重命…

千言数据集赛题介绍

赛题题目 通用信息抽取任务评测 将多种不同的信息抽取任务用统一的通用框架进行描述,着重考察相关技术方面在面对新的、未知的信息抽取任务与范式时的适应和迁移能力。 赛题介绍 信息抽取旨在将非结构化文本中的信息进行结构化,是自然语言处理的基础…

Highcharts 写 venn图 (韦恩图),以及解决项目中venn的报错

Highcharts 写 venn图 鼠标悬浮效果以及点击事件 效果图如下: 参考highcharts官网venn 具体方法 安装包依赖:npm install highcharts //组件中引入 import Highcharts from highcharts; // import exportingInit from highcharts/modules/export…

【项目总结】基于SSM+SpringBoot+Redis的个人博客系统项目总结

文章目录项目介绍(开发背景)数据库设计主要使用到的技术点前端后端自定义统一返回对象自定义拦截器加盐加密操作分页功能session持久化自定义头像的存储和获取项目编写过程中遇到的困难点困难点一(小)困难点二(小&…

C++11:右值引用和移动语义

文章目录1. 左值和右值表达式1.1 概念1.2 左值和右值2. 左值引用和右值引用2.1 相互引用2.2 示例代码2.3 左值引用使用场景缺点2.4 右值引用和移动语义小结2.5 移动赋值2.6 右值引用的其他使用场景右值引用版本的插入函数3. 完美转发3.1 万能引用3.2 如何实现完美转发3.3 完美转…

u盘拔掉再插上去文件没了原因|文件恢复方法

如果您遇到了“u盘拔了再插文件变空了”的类似问题困扰,请仔细阅读文本,下面将分享几种方法来恢复u盘上丢失的文件,赶紧来试试!为什么u盘拔掉再插上去文件没了“我的u盘为什么放进东西后拔出,再插进电脑去东西就没有了…

从零开始学架构——复杂度来源

复杂度来源——高性能 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高,相应的方法和系统复杂度也是越来越高。现代的计算机CPU集成…

前端——5.HTML标签_段落标签和换行标签

这篇文章,我们来讲解一下HTML标签中的段落标签和换行标签 目录 1.段落标签 1.1介绍 1.2实际案例 1.3小拓展 2.换行标签 2.1介绍 2.2实际案例 3.小结 1.段落标签 我们首先来讲解一下段落标签 1.1介绍 在网页中,要把文字有条理地显示出来&…

图像主题颜色提取(Median cut)

前言 之前想对图片素材进行分类管理,除了打标签,还有一样是通过主题色进行分类。于是开始寻找能提取主主题色的工具,最后找到了大名鼎鼎的 Leptonica 库,其中就有中位切割算法的实现。下面附上中位切割算法的其它语言版本的实现。…

keras图片数字识别入门AI机器学习

通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程。 本例子,要基于mnist数据集(该数据集包含了【0-9】的模型训练数据集和测试数据集)来完成一个手写数字识别的小demo。 mnist…

Linux内核之内存管理知识以及伙伴系统

内存管理知识以及伙伴系统一、Linux 内核架构图二、虚拟内存地址空间布局2.1、用户空间2.2、内核空间2.3、硬件层面2.4、虚拟地址空间划分2.5、用户虚拟地址空间布局2.6、进程的进程描述和内存描述符关系2.7、内核地址空间布局三、SMP/NUMA 架构3.1、SMP3.2、NUMA四、伙伴系统及…

传输线的物理基础(四):传输线的特性阻抗

特性阻抗和控制阻抗对于一条均匀的线,无论我们选择看哪里,我们都会看到沿线传播时相同的瞬时阻抗。有一个表征传输线的瞬时阻抗,我们给它起了一个特殊的名字:特性阻抗。有一个瞬时阻抗是均匀传输线的特征。我们将这种恒定的瞬时阻…

RZ/G2L工业核心板U盘读写速率测试

1. 测试对象HD-G2L-IOT基于HD-G2L-CORE工业级核心板设计,双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等,接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。HD-G2L…

idm如何下载种子文件和磁力链接 idm如何下载torrent

采用分段式下载技术并支持断点续传的idm下载加速器,几乎可以胜任所有的下载任务。由于该软件强大的下载能力和仅为10MB的小巧体积,idm被来自全球的用户亲切地称为天花板级的下载软件。那么有关idm如何下载种子文件和磁力链接,idm如何下载torr…

基于vivado(语言Verilog)的FPGA学习(1)——了解viviado面板和编译过程

基于vivado(语言Verilog)的FPGA学习(1)——了解程序面板和编译过程 每日废话:最近找实习略微一些焦虑,不想找软件开发,虽然有些C和python基础(之前上课学的),…

编码技巧——Redis Pipeline

本文介绍Redis pipeline相关的知识点及代码示例,包括Redis客户端-服务端的一次完整的网络请求、pipeline与client执行多命令的区别、pipeline与Redis"事务"、pipeline的使用代码示例; pipeline与client执行多命令的区别 Redis是一种基于客户…