Unity2023.1.19_DOTS_JobSystem

Unity2023.1.19_DOTS_JobSystem

上篇我们知道了DOTS是包含Entity Component System,Job System,Burst compiler三者的。接下来看下JobSystem的工作原理和具体实现。

简介:

官方介绍说:JobSystem允许您编写简单而安全的多线程代码,以便您的应用程序可以使用所有可用的CPU内核来执行代码。也就是说JobSystem是为多线程服务的一个模块。

JobSystem可以单独使用,但为了提高性能,也还应该使用Burst compiler,Burst compiler是专门为Unity的JobSystem编译而设计的。urst compiler改进了代码生成,从而提高了性能并减少了移动设备上的电池消耗。Burst compiler将在JobSystem之后再关注。

JobSystem和Burst compiler一起使用的时候,JobSystem工作效果最好。因为Burst不支持托管对象,所以需要使用非托管类型来访问Job中的数据。你可以使用blittable types,或者使用Unity内置的Native container对象,这是一个线程安全的c#本机内存包装器。NativeContainer对象还允许job访问与主线程共享的数据,而不是使用副本。

ECS为其进行了拓展Unity.Collections命名空间以包含其他类型的 NativeContainer:

NativeList - 可调整大小的 NativeArray,类似于List
NativeHashMap<T, R> - 键/值对,类似于Dictionary<T, R>
NativeMultiHashMap<T, R> - 每个键有多个值。
NativeQueue - 先进先出队列,类似于Queue

也可以在ECS中使用JobSystem创建高性能的面向数据代码。

Collections Package提供可在job和Burst-compiled代码中使用的非托管数据结构。

Unity使用原生的JobSystem处理原生代码使用多个工作线程,工作线程取决于你应用程序运行设备的CPU核的可用数量。

通常Unity默认在程序开始时在一个主线程上执行你的代码,你可以使用JobSystem在多个工作线程上执行你的代码,称之为多线程。

简单代码说明:

using UnityEngine;
using Unity.Collections;
using Unity.Jobs;// Job adding two floating point values together
// It implements IJob, uses a NativeArray to get the results of the job, and uses the Execute method with the implementation of the job inside it:public struct MyJob : IJob
{public float a;public float b;public NativeArray<float> result;public void Execute(){result[0] = a + b;}
}

下面的例子建立在MyJob任务上,在主线程上调度一个任务:

using UnityEngine;
using Unity.Collections;
using Unity.Jobs;public class MyScheduledJob : MonoBehaviour
{// Create a native array of a single float to store the result.// Using a NativeArray is the only way you can get the results of the job, whether you're getting one value or an array of values.NativeArray<float> result;// Create a JobHandle for the job// 给任务创建一个任务处理JobHandle handle;// Set up the job// 创建一个任务public struct MyJob : IJob{public float a;public float b;public NativeArray<float> result;public void Execute(){result[0] = a + b;}}// Update is called once per frame// 每一帧更新void Update(){// Set up the job data 设置任务数据result = new NativeArray<float>(1, Allocator.TempJob);MyJob jobData = new MyJob{a = 10,b = 10,result = result};// Schedule the job 安排任务handle = jobData.Schedule();}private void LateUpdate(){// Sometime later in the frame, wait for the job to complete before accessing the results.// 稍后在框架中,等待作业完成后再访问结果。handle.Complete();// All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray// float aPlusB = result[0];// Free the memory allocated by the result array// 释放由结果数组分配的内存result.Dispose();}}

 跟一个测试:

using UnityEngine;
using Unity.Collections;
using Unity.Jobs;public class MyScheduledJob : MonoBehaviour
{// Create a native array of a single float to store the result.// Using a NativeArray is the only way you can get the results of the job, whether you're getting one value or an array of values.NativeArray<float> result;// Create a JobHandle for the job// 给任务创建一个任务处理JobHandle handle;// Set up the job// 创建一个任务public struct MyJob : IJob{public float a;public float b;public NativeArray<float> result;public void Execute(){result[0] = a + b;}}// Update is called once per frame// 每一帧更新void Update(){// Set up the job data 设置任务数据result = new NativeArray<float>(1, Allocator.TempJob);MyJob jobData = new MyJob{a = 10,b = 10,result = result};// Schedule the job 安排任务handle = jobData.Schedule();}private void LateUpdate(){// Sometime later in the frame, wait for the job to complete before accessing the results.// 稍后在框架中,等待作业完成后再访问结果。handle.Complete();// All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray// float aPlusB = result[0];// Free the memory allocated by the result array// 释放由结果数组分配的内存result.Dispose();}}

 

意思大概是这样了,具体实践具体看!!

参考文档:

官方文档

Unity - Manual: Job system overview (unity3d.com)

Collections package | Collections | 2.2.1 (unity3d.com)

Unity - Manual: Thread safe types (unity3d.com)

这个博主系列的讲到了DOTS,可以看一下:

DOTS ECS_铸梦xy的博客-CSDN博客

 

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

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

相关文章

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…

XSS漏洞-存储型漏洞案例

一、环境 在github上找DVWA的靶机环境 DVWA存储库 二、复现 先将其安全等级改为低 然后点击存储型的xss&#xff0c;先随便写几条看看现象 可以看到我们写的都展示在了下面的框中 看看源码&#xff0c;分析在存储时的漏洞 我们可以看到&#xff0c;在对数据插入的时候&am…

01_04_JavaWEB01_HTMLCSS

一 HTML入门 参考尚硅谷再总结复习 1.1 HTML&CSS&JavaScript的作用 HTML 主要用于网页主体结构的搭建 CSS 主要用于页面元素美化 JavaScript 主要用于页面元素的动态处理 1.2 什么是HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭…

筛选出等于1的式子

然后统计和归类 归类分行归类方法 算术符号归类 数字大小排序算术符号归类 import randomdef generate_expression(num_range, num_count, operators):nums random.sample(range(num_range[0], num_range[1]1), num_count)ops random.choices(operators, knum_count-1)expre…

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling ChatGPT结合实际业务&#xff0c;主要是研发多函数调用&#xff08;Function Calling&#xff09;功能模块&#xff0c;将自定义函数通过ChatGPT 问答结果&#xff0c;实现对应函数执行&#xff0c;再次将结果…

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…

强引用、软引用、弱引用、幻象引用 —— Java的四种引用类型解析

强引用、软引用、弱引用、幻象引用 —— Java的四种引用类型解析 在Java中&#xff0c;对象的生命周期并不总是由我们直接控制。除了我们常见的强引用外&#xff0c;Java还提供了软引用、弱引用和幻象引用这三种引用类型&#xff0c;它们对对象生命周期的影响各不相同。理解这…

一步到位!快速精通Git工作流及实战技巧详解

Git是一个分布式版本控制系统。 1、git的应用场景 1.备份 小明负责的模块就要完成了&#xff0c;就在即将release之前的一瞬间&#xff0c;电脑突然蓝屏。硬盘光荣牺牲&#xff01;几个月来的努力付之东流。 场景二&#xff1a;代码还原 这个项目中需要一个很复杂的功能&…

Linux下使用MD5SUM命令详解

在Linux操作系统中&#xff0c;md5sum是一个非常实用的工具&#xff0c;用于生成和校验文件的MD5散列值。MD5是一种广泛使用的密码散列函数&#xff0c;可以产生一个128位&#xff08;16字节&#xff09;的散列值&#xff0c;常用来确保数据的完整性和一致性。 一、MD5SUM命令…

【Java】<Java类库> 与 <Java标准库>

Java标准库 和 Java类库 在某种程度上是相互关联的概念&#xff0c;但它们又有一些不同之处。 Java标准库&#xff1a; Java标准库是指Java平台提供的一组标准的类和接口的集合&#xff0c;用于实现Java程序的基本功能和常见任务。Java标准库是Java平台的一部分&#xff0c;包含…

CVHub | 初识langchain,3分钟快速了解!

本文来源公众号“CVHub”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;初识langchain 1 什么是langchain langchain[1]是一个用于构建LLM-Based应用的框架&#xff0c;提供以下能力: 上下文感知&#xff1a;可以为LLM链接上下文…

《Python源码剖析》之字符串拼接的一个效率问题

前言 我们常用的字符串拼接方法有两个&#xff0c;一个是通过“”号实现字符串的拼接&#xff0c;还一个就是通过join方法来实现拼接&#xff0c;前者在写法上更加便利&#xff0c;和数字之间的加法运算一样&#xff0c;通常只有两个运算对象&#xff0c;只不过他们的运算规则…

XS2186 PSE控制器产品-八通道,兼容IEEE 802.3at/af

XS2186 PSE控制器产品-八通道&#xff0c;兼容IEEE 802.3at/af 芯片特性&#xff1a; 八通道&#xff0c;兼容IEEE 802.3at/af 0.1Ω内置电流检测电阻 内置电源功率管 每个端口高达30W 10位端口电流和电压实时监测 兼容I2C&#xff0c;3线串口 支持独立供电操作 为遗…

新贵Claude 3家族强势登场,AI领域掀起新一轮浪潮!

人工智能领域的风云再起,Anthropic公司日前放出狠招,推出了全新的大模型家族Claude 3系列。Claude 3由三款不同级别的大模型组成,分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。这一系列产品的推出,不仅扩充了AI生态,更是对OpenAI的GPT-4等龙头产品发出了挑战。让我们…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

利用GPT开发应用005:Codex、Turbo、ChatGPT、GPT-4

文章目录 一、GPT-3 Codex二、GPT-3.5 Turbo二、ChatGPT三、GPT-4 一、GPT-3 Codex 2022年3月&#xff0c;OpenAI 发布了 GPT-3 Codex 的新版本。 这个新模型具有编辑和插入文本的能力。它们是通过截至 2021 年 6 月的数据进行训练的&#xff0c;并被描述为比之前版本更强大。到…

力扣爆刷第88天之hot100五连刷26-30

力扣爆刷第88天之hot100五连刷26-30 文章目录 力扣爆刷第88天之hot100五连刷26-30一、142. 环形链表 II二、21. 合并两个有序链表三、2. 两数相加四、19. 删除链表的倒数第 N 个结点五、24. 两两交换链表中的节点 一、142. 环形链表 II 题目链接&#xff1a;https://leetcode.…

ospf静态路由实验简述

1、ospf静态路由实验简述 实验拓扑图 实验命令 r2: sys sysname r2 undo info enable int loopb 0 ip add 2.2.2.2 32 quit int e0/0/0 ip add 23.1.1.2 24 quit ospf 1 area 0 network 23.1.1.0 0.0.0.255 network 2.2.2.2 0.0.0.0 ret r3: sys sysname r3 undo info enable …

C++vector简单实现

由于我们之前已经详细讲解了string接口&#xff0c;而vector接口大都在string上有&#xff0c;所以大家只需自行翻阅前面文章就可以明白接口的使用了&#xff0c;所以&#xff0c;这里我们只实现vector&#xff0c;注意&#xff1a;vector会有迭代器失效的情况&#xff0c;大家…

SuperNIC:用于人工智能的网络加速器

随着人工智能的复杂性和规模不断增长&#xff0c;传统的网络解决方案往往无法满足这些先进系统的数据密集型需求。为了解决人工智能工作负载所面临的问题&#xff0c;SuperNIC应运而生。在本文中&#xff0c;我们将探讨SuperNIC的变革能力&#xff0c;探索它如何革新网络性能&a…