Unity Dots理论学习-2.ECS有关的模块(1)

Unity的实体组件系统(ECS)是支撑DOTS模块和技术的面向数据架构。ECS为Unity中的内存数据和runtime进程调度提供了高度的控制和确定性。

ECS for Unity 2022 LTS 配备了两个兼容的物理引擎,一个高级的Netcode package,以及一个用来将大量ECS数据渲染到Unity的可编程渲染管线(SRP)、通用渲染管线(URP)和高清晰度渲染管线(HDRP)的渲染框架。这套ECS框架与GameObject数据兼容,允许你使用一些Unity 2022 LTS中尚未原生支持ECS的系统,如动画、导航、输入或地形。

本节重点介绍DOTS的功能,以及它们如何帮助开发者避免前面提到的会造成CPU性能瓶颈的代码。

学习有关DOTS具体内容的最佳起点是EntityComponentSystemSamples Github,它包含了说明书和视频的同时还包含许多示例工程。

然而,在深入学习这些示例之前,我们先来看看用于构建这套技术栈的功能和模块。

C#job系统

C#job系统提供了一种简单高效的方式来编写多线程代码,帮助你的应用充分利用所有可用的CPU核心。

与DOTS的其他功能不同,job系统不是一个单独的模块,而是包含在Unity核心模块中。

因为MonoBehaviour的更新只在主线程上执行,所以许多Unity游戏最终都会把所有游戏逻辑都运行在一个CPU核心上。为了利用额外的核心,你可以手动创建和管理额外的线程,但这样做在提高代码难度的同时又提高了代码风险。

作为一种更简单的替代方案,Unity提供了C#job系统:

job系统维护一个job线程池,每个目标平台的额外核心对应一个线程。例如,当Unity在八个核心上运行时,它会创建一个主线程和七个job线程。

job线程执行称为job的工作单元。当job线程空闲时,它会从job队列中拉取下一个可用的job进行执行。

一旦某个job开始在job线程上执行,它就会一直执行到完成(换句话说,job不会被抢占)

job的调度和完成

job只能被主线程调度(即,添加到job队列中),不能从其他job中被调度。

当主线程调用已调度job的Complete()方法时,它会等待job完成执行(如果job尚未完成)。

只有主线程可以调用Complete()。

Complete()返回后,你可以确定job使用的数据在主线程上可以再次安全访问,并且可以安全地传递给后续的被调度的job。

job安全性检查和依赖关系

在多线程编程中,确保线程安全和管理线程之间的依赖关系对于避免竞态条件、数据损坏和其他并发问题至关重要。解释这些陷阱超出了本指南的范围。关键的要点是理解job系统如何处理安全性检查和依赖关系:

为了确保隔离性,每个job都有自己的私有数据,主线程和其他job无法访问这些数据。

然而,job也可能需要与彼此或主线程共享数据。 共享相同数据的job不应并发执行,因为这会导致竞态条件。因此,当你调度可能互相冲突的job时,job系统的“安全检查”会抛出错误。

在调度job时,你可以声明它依赖于之前调度的job。 job线程在执行某个job前会保证它依赖的所有的job都执行完成,这样你就可以安全地调度本来可能会冲突的job。例如,如果jobA和jobB都访问相同的数组,你可以让jobB依赖于jobA。 这确保jobB不会在jobA完成之前执行,从而避免任何可能的冲突。

完成一个job时,代表已经完成了它直接或间接依赖的所有job。

许多Unity功能内部都在使用job系统,因此在Profiler中,你会看到不仅仅是你自己调度的job在job线程上运行。

注意,job仅用于处理内存中的数据,而不是执行I/O(输入输出)操作,例如读取和写入文件或通过网络连接发送和接收数据。因为一些I/O操作可能会阻塞调用线程,在job中执行它们会违背最大化CPU核心利用率的目标。如果你想做多线程的I/O job,你应该从主线程调用异步API或使用传统的C#多线程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQLi_Labs】Basic Challenges

什么是人生?人生就是永不休止的奋斗! Less-1 尝试添加’注入,发现报错 这里我们就可以直接发现报错的地方,直接将后面注释,然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅,数据是准确的,领导基本满意。 就是对一些数字的格式化提出了改进建议,比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来,根…

STM32 高级 WIFi案例1:测试AT指令

需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果: 思路: Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用…

通过无障碍服务(AccessibilityService)实现Android设备全局水印显示

一、无障碍功能简介 首先我们先来了解下无障碍功能的官方介绍: 无障碍服务仅应用于帮助残障用户使用 Android 设备和应用。它们在后台运行,并在触发 AccessibilityEvents 时接收系统的回调。此类事件表示用户界面中的某些状态转换,例如焦点已…

查看vue的所有版本号和已安装的版本

1.使用npm查看Vue的所有版本: npm view vue versions2.查看项目中已安装的 Vue.js 版本 npm list vue

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…

js ul li 事件委托

<ul><li>1111111111</li><li>2222222222</li><li>3333333333</li><li>4444444444</li> </ul>常规的 li 绑定点击事件 document.querySelectorAll(ul li).forEach((li) > {li.addEventListener(click, functio…

vue 嵌套el-dialo,当内层的弹窗弹出时,整个页面被遮罩

活不多说&#xff0c;直接上问题 当在页面上&#xff0c;点击出现第一个弹窗&#xff0c;然后在弹窗里面&#xff0c;点击在再出现一个弹窗时&#xff0c;就是如下效果。 查看Html,出现了遮罩层 Vue的建议是&#xff0c;不建议嵌套 Dialog&#xff0c;但实际上肯定存在嵌套 …

在基于Centos7的服务器上启用【Gateway】的【Clion Nova】(即 ReSharper C++ 引擎)

1. 检查启动报错日志&#xff0c;目录在 ~/.cache/JetBrains/CLion202x.x.x/log/backend.202x-xx-xx_xxxx.xxxx-err.log 2. 大致可能有两种报错 a. Process terminated. Couldnt find a valid ICU package installed on the system. 这个报错只需要装一下 libicu-devel 包即可…

短视频是如何一步步“蚕食”我们大脑的?

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 今天我们将深入探讨短视频是如何「蚕食」我们的大脑。 首先问下自己&#xff0c;你有多久没有看完一篇长文了&#xff1f; 你是否曾在清晨阳光中&#xff0c;被手机屏幕上短视频图标吸引&#xff0c;而忘记…

1、Jmeter、jdk下载与安装

1、访问官网&#xff0c;点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间&#xff0c;下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好&#xff0c;先安装JDK ![在这里插入图片描述](https://i-blog.csdnimg…

Hive刷分区MSCK

一、MSCK刷分区 我们平时通常是通过alter table add partition方式增加Hive的分区的&#xff0c;但有时候会通过HDFS put/cp命令或flink、flum程序往表目录下拷贝分区目录&#xff0c;如果目录多&#xff0c;需要执行多条alter语句&#xff0c;非常麻烦。Hive提供了一个"…

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

solr9.7 单机安装教程

1.环境要求:jdk11以上 2.下载wget https://dlcdn.apache.org/solr/solr/9.7.0/solr-9.7.0.tgz 3.解压 4.修改solr.in.sh配置 5.启动命令 bin/solr start 6.创建core bin/solr create -c <core名称> 注意:用solr ui界面创建&#xff0c;会提示找不到solrconfig.xml和m…

MySQLOCP考试过了,题库很稳,经验分享。

前几天&#xff0c;本人参加了Oracle认证 MySQLOCP工程师认证考试 &#xff0c;先说下考这个证书的初衷&#xff1a; 1、首先本人是从事数据库运维的&#xff0c;今年开始单位逐步要求DBA持证上岗。 2、本人的工作是涉及数据库维护&#xff0c;对这块的内容比较熟悉&#xff…

【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存

问题描述 从DBeaver中导出了部分业务数据的 insert sql&#xff0c;明明在开发、测试环境都可以一把执行通过&#xff0c;却在预发环境执行前的语法检查失败了&#xff0c;提示有SQL语法错误。 这条SQL长这样&#xff0c;default_sql是要在odps上执行的sql语句&#xff0c;提…

计算机网络 (8)物理层的传输方式

一、串行传输与并行传输 串行传输 定义&#xff1a;串行传输是一种数据传输方式&#xff0c;指的是逐位地按照顺序传输数据。在串行传输中&#xff0c;数据位逐个按照一定的顺序进行传输&#xff0c;可以通过单条线路或信道进行。特点&#xff1a; 逐位传输&#xff1a;串行传输…

springboot506基于Springboot的小区疫情购物系统录(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…