【Unity Dots之Ecs原理分析(无入门代码示例)】

Unity Ecs原理分析

  • 前言
  • 一、ECS是什么?
    • Entity是什么?
    • Component是什么?
    • System是什么?
    • 不得不提的Archetype
      • 为什么时16kb?
    • 什么是Structural Change?
    • ASpect
    • 有关ECS使用时的安全性
    • Conversion World & Shadow world
  • 总结


前言

Unity 的ECS 是Unity DOTS的组成部分,是编码的重要部分,DOTs的其他方面还包含Brust Compiler等等。

一、ECS是什么?

ECS是Entity,Component,System 的简写,这三个便是ECS最核心的组成部分,常规的,开发者在使用Unity进行游戏开发时采取面向对象的编程思想,使用非常直观的GameObject,GameObject上面添加的组件以及脚本控制,在运行时在场景中初始化,改变物体的行为等等。ECS架构采用的是面向数据的编程思想,通过对数据的合理化排列以及组合,充分利用Cpu缓存命中,充分利用内存,将组件分类并在使用时直接通过改变组件的数据使得场景中的游戏物体Transform。

Entity是什么?

Entity 是一个将独立组件关联起来的ID,而不是将其包含在一起的容器。也就是说Entity并不负责存储数据,仅是作为唯一ID将相互独立的组件关联起来,Entity默认情况下被存储在一个World中(默认情况下一个Scene也仅包含一个可操作的World(后续会提到开发者不能直接操作的World)),EntityManager可以创建,销毁和更新Entity。

Component是什么?

Component就是组件,负责在ECS架构下存储数据,ECS架构下,有默认的组件如Transform等,开发者也可以根据需要通过组合和设计来创建新的组件,并在Baker中进行Baking。

System是什么?

System 用于将Component上的数据从一种状态转换到另一种状态,System运行在主线程的每一帧上。

不得不提的Archetype

在Entity介绍中提到,Entity将独立的组件关联起来,关联起来的Component便可以组合成一个ArcheType,而相同的ArcheType在ECS架构中会以16kb为单位存储成Chunk。

为什么时16kb?

16kb无论是分页内存还是Cpu寻址最大范围抑或是Cpu缓存L1时16k的整数倍,16kb的选择既是出于对数据存储大小考虑,更是对Cpu缓存命中以及数据对Cpu 的易操作性的考量,使得Cpu极大程度的发挥它的能力。
提到内存利用就要展开聊一下Chunk,如图:
在这里插入图片描述
如上图所示,组件和Entity在chunk中以16kb为一个chunk紧密的排列在一起,所以在查询和遍历时开发者才可以如此迅速的找到对应的Entity以及所关联的Component,在对游戏场景内Entity关联的Component进行数据更改时效率会非常高。

什么是Structural Change?

结构化更改既在对Entity与其组件的更新过程中,对Chunk中的存储数据进行了删除,插入,以及对ShareComponent 修改了值。从而破坏了原本的chunk结构,经过更改后,原本的存储结构更新,而这样的更新是非常消耗的, ECS架构依赖于CPU充分利用缓存机制的同时,也充分利用多线程,显然的,chunk是在线程中共享的,Structural change发生,如果不加以处理,很容易造成空悬引用和位置错误,所以Unity引入了Sync Point。既然有同步点,就有同步机制,有同步机制就有线程等待等等的操作,从而大幅降低了当前帧的运行速率。
而在ECS架构的使用过程中,不可避免的需要有结构化更新来使得内容更加丰富,这就引入了EntityCommandBuffer,使用EntityCommandBuffer可以将耗时操作分帧进行,从而降低帧间隔。

ASpect

Aspect在C#代码中可以将component 结构化的编辑到一起,在查询遍历时会非常的方便,在使用过程中必须添加readonly,readonly并不代表Aspect是只读的,真正起作用的是RefRO & RefRW,提供了只读和读写访问,特别需要注意的是,当引用一个Aspect时请使用in 对应ReadOnly数据,使用ref对应ReadWrite数据。

有关ECS使用时的安全性

Entities包的许多内部API使用unsafe code block和原始指针来获得最佳性能。一些API返回对数据的引用,这些引用可能比引用的数据更持久。Job System 也并不保证数据的正确性和安全性,所以在使用时开发者在使用JobSystem时需要自行注意数据的安全性。

Conversion World & Shadow world

还记得最开始提到的world么,ECS架构中,将World按照主要用途分为两大类,一类是 Conversion World,用于对常规Gameobject以及在Baker中编辑的Authoring Data转换为Entity以及与之相关联的Component。而转换分类为full baking & incremental baking,living baking通常在开发者更新subcene内容时因改变而全量baking --> 从无到最新的过程,而incremental baking,使用Shadow World记录最新一次的更新,并在下一次更新时只baking增量改变而不是全量baking,也正因如此,原始baking的数据不变,可能会使得full baking 和 incremental baking之间存在差异。


总结

以上便是在开发过程中非常重要且常用得几个点,当然因为ECS与原始得Unity处理方式并不兼容,Unity也为physics,render都分别提供了不同的包用于针对于ECS架构的开发,ECS + Brust Complier + JobSystem 在复杂游戏效果中更加出众,诸如弹壳特工队便是使用DOTs + GPU Instancing 来实现的。
后续文章会将Brust Compiler + Job System 补全

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

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

相关文章

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…

【大模型推理】all-reduce

https://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/#ref-4 1. ALL reduce , reduce, broadcast 概念 Introduction 在过去的几年中,神经网络已经被证明是解决各种问题的令人难以置信的有效工具,并且在规模和计算需求上都迅速增长。…

opencv(c++)---自带的卷积运算filter2D以及应用

opencv(c)—自带的卷积运算filter2D以及应用 #include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std;int main() {Mat imgin, imgout;imgin imread("D:/1234.png");if (imgin.empty()){cout << "Could …

C++20中的Concepts与TypeScript

C20中的Concepts与TypeScript 大家好&#xff01;上一篇聊了C20中概念&#xff08;Concepts&#xff09;&#xff0c;这是一个非常赞的特性&#xff0c;极大简化了模板编程&#xff0c;但是如果跳出C去查看一下其他编程语言的特性&#xff0c;就会发现&#xff0c;这样类似的特…

联想thinkpad笔记本哪些配置可以安装win7_联想thinkpad笔记本装win7解析(支持新旧机型)

联想thinkpad笔记本哪些配置可以安装win7&#xff1f;联想ThinkPad L14在安装win7后usb键盘不能使用&#xff0c;并且bios中要关闭安全启动和开启CSM兼容模式&#xff0c;那么联想ThinkPad L14要怎么安装win7系统呢&#xff1f;下面小编就给大家介绍详细的联想ThinkPad L14装wi…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

实习冲刺第二十五天

283.移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 思路详解&#xff1a…

使用QTimer和SIGNAL/SLOT机制来实现系统时间的显示

在Qt中&#xff0c;使用QTimer和SIGNAL/SLOT机制来实现系统时间的显示是一个常见的做法。下面是如何实现这一功能的步骤&#xff1a; 创建定时器&#xff1a; 首先&#xff0c;你需要创建一个QTimer对象。QTimer是一个定时器类&#xff0c;可以在指定的时间间隔后发出信号。 QT…

Win11安装软件被系统阻止安装?解除限制的方法

Windows 11作为最新的操作系统&#xff0c;加入了许多安全性和稳定性的新特性。但也因此&#xff0c;一些用户在安装软件时可能遇到“安装被阻止”或“无法从此位置安装应用程序”的提示。这通常是由于系统的默认安全设置或权限限制导致的。本文将探讨这些限制的原因&#xff0…

三角波生成函数

% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒&#xff0c;步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库&#xff1a; https://github.com/sgl-project/sglang 项目说明书&#xff1a; https://sgl-project.github.io/start/install.html 资讯&#xff1a; https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

『大模型笔记』AI自动化编程工具汇总!

『大模型笔记』AI自动化编程工具汇总! 文章目录 一. Bolt.new(开源AI驱动全栈Web开发工具)1.1. Bolt.new介绍1.2. 编程小白如何打造自己的导航网站二. Cursor(人工智能代码编辑器)2.1. Cursor入门教程2.2. Cursor左侧布局设置和VSCode一样一. Bolt.new(开源AI驱动全栈Web开发工…

网页全终端安防视频流媒体播放器EasyPlayer.jsEasyPlayer.js关于多屏需求

EasyPlayer.js网页全终端安防视频流媒体播放器是一款功能强大的H5播放器&#xff0c;支持多种视频协议&#xff0c;包括HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4等&#xff0c;兼容视频直播与点播功能。同时&#xff0c;它支持多种音视频编码格式&a…

大模型外挂知识库优化——如何利用大模型辅助召回

大模型外挂知识库优化——如何利用大模型辅助召回&#xff1f; 一、为什么需要使用大模型辅助召回&#xff1f; 我们可以通过向量召回的方式从文档库里召回和用户问题相关的文档片段&#xff0c;同时输入到LLM中&#xff0c;增强模型回答质量。 常用的方式直接用用户的问题进…

three.js实现地球 外部扫描的着色器

three.js实现地球 外部扫描的着色器 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idearthScan import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GUI } from three/ex…

STM32 BootLoader 刷新项目 (十一) Flash写操作-命令0x57

STM32 BootLoader 刷新项目 (十一) Flash写操作-命令0x57 1. 引言 嵌入式系统中&#xff0c;BootLoader 是设备启动的第一部分代码&#xff0c;负责硬件初始化和主程序加载。在 STM32F407 中&#xff0c;BootLoader 的另一重要功能是支持应用程序的在线升级&#xff0c;这需要…

Spring IoC——针对实习面试

目录 Spring IoC谈谈你对Spring IoC的理解IoC和DI有区别吗&#xff1f;IoC&#xff08;控制反转&#xff09;DI&#xff08;依赖注入&#xff09;IoC与DI的区别 什么是Spring Bean&#xff1f;作用域有哪些&#xff1f;Bean是线程安全的吗&#xff1f;说一下Spring Bean的生命周…

【H2O2|全栈】MySQL的云端部署

目录 前言 开篇语 准备工作 MySQL移除 为什么需要移除&#xff1f; 移除操作 Yum仓库 yum简介 rpm安装 yum库安装 MySQL安装 使用yum安装 开机自启动 检查运行状态 MySQL配置 初始密码 ​编辑登录 修改root密码 退出MySQL 字符集配置 结束语 前言 开篇语…

数据结构-二叉平衡树

一.平衡二叉树 二叉搜索树插入的次序不同导致不同的深度和平均查找长度ASL 左右子树高度差不超过绝对值1的二叉搜索是二叉平衡树 二.平衡二叉树的调整 在右子树的右子树上的插入做RR插入 把被破坏节点的右子树变成跟节点并把这个右子树的左子树挂载到原来被破坏的结点的右子树…

【PCIE716-0】基于PCIe总线架构的XC7Z100 FPGA高性能实时信号处理平台

板卡概述 PCIE716-0是一款基于PCIe总线架构的XC7Z100 FPGA高性能实时信号处理平台。该平台采用Xilinx的ZYNQ SOC系列产品XC7Z100作为主处理器。 该平台的PL端具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#xff0c;支持1路UART串口、支持1组6…