Unity Dots学习内容记录(未编写完)

2024-02-22 14:36

本文主要是介绍Unity Dots学习内容记录(未编写完),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • ECS的相关概念
  • Unity的环境搭建
  • Package包的使用
  • JobSystem和Burst
  • 参考文档


前言

主要是记录下学习unity dots技术的过程吧。


ECS的相关概念

在进行理解ECS之前,需要理解CPU中的Data Layout。
比方说CPU在执行处理指令时是需要将内存里的数据拷贝到CPU要本地的Cahce里面的。结构如下:
在这里插入图片描述
当CPU执行指令要访问数据的时候,首先会在Cache里面寻找这个数据,如果没有找到这个时候就产生了一次Cache Miss。
在这里插入图片描述
接下来它就要到内存里面拷贝一个数据到 CPU 的 Cache 里面,但是这个步骤是非常慢的。当从内存拷贝到 CPU 的 Cache 之后,再从 Cache 里访问这个数据就会非常快。后面再去访问这一条 Cache line 中的数据都会是非常快的。
在这里插入图片描述
在这里插入图片描述
如果后面继续访问数据,发现到了上次拷贝过的数据没有覆盖的另一条 Cache line,就又会发生一次 Cache miss,又会比较慢,需要再去内存拷贝数据。
在这里插入图片描述
在这里插入图片描述
ECS是Enity Component System的缩写,是一种面向数据编程的设计思想,Enity只存放世界场景中的Id(唯一标识),数据放在Component里面,System处理这些数据的逻辑。

值得注意的是,ECS和传统的老GameObject方式不一样。
因为我们在使用传统的GameObject(面向对象)的方式进行编程时候,代码访问内存的地址是随机的,所以产生的内存是零散的,这个时候就会造成CPU大量的Cache Miss,这样会造成大量的性能浪费。
下图为使用GameObject的方式编程时,内存的布局分配。
在这里插入图片描述
所以之后引用了ECS的概念,主要是为了使我们的数据结构对CPU友好,使用ECS的数据结构如下图
在这里插入图片描述
那么这里会有个问题,比方上面的图图片,对应的Enity的下面,不同的方块颜色为不同的组件,上面有4个Enity为7个组件,5个enity有5个组件,那么这样就会产生了不同的Archetype。带入,相同的组件数但是组件不相同也是不同的Archetype。当然不同 Archetype 之间可能会共享一些 Component 数据结构,可以去利用这一点来加速计算。

有了 DOTS 的这种结构之后,实际去执行代码的时候会有一个操作叫做 Query,来 Query 需要的数据对象进行处理。
举个例子,可能有 10 种 Archetype,其中可能有 5 种 Archetype 都有 position 这种 Component。当想要处理所有 position 这些数据计算的时候,首先执行 Query,查询所有有 position Component 的这些 Entity,可以把它查询出来,并且连续放在内存里面。

Query 结束之后,下一步就是执行 System 里面的代码,会顺序处理所有的数据。因为这些数据都是连续存储的,会非常快速地拷贝到 CPU 的 Cache 里面,数据计算就会非常迅速。
在这里插入图片描述
在这里插入图片描述
这里其实有几个注意点。首先,Entity 里面是没有数据的,它和老的 GameObject 是不一样的。GameObject 每一个对象里面存储了自己的数据,有自己的脚本,去处理自己的业务逻辑,但是到了 ECS 之后,Entity 是没有数据的,所有的数据放在 Component 里面。System 里面的代码先做 Query,Query 出来需要的数据之后再对它进行处理。

Unity的环境搭建

IDE和编辑器的版本支持
Unity版本为2022.3.0f1或以上
Visual Studio 2022或以上
Rider 2021.3.3或以上

安装Package
打开Unity,选中Unity的菜单Window->Packages Manager。点击左上角+号。点击Add Package by name。
把com.unity.entities拷贝上去并且点击Add,等待添加Package下载安装完成。如下图
在这里插入图片描述

Package包的使用

JobSystem和Burst

参考文档

ECS官方文档
CECC | Unity DOTS:面向数据编程的技术栈

这篇关于Unity Dots学习内容记录(未编写完)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/735555

相关文章

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2