Unity2023.1.19_DOTS_JobSystem

2024-03-06 22:28
文章标签 19 dots unity2023.1 jobsystem

本文主要是介绍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博客

 

这篇关于Unity2023.1.19_DOTS_JobSystem的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点:         第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分)。在历年考试中,案例题对该部分内容都有固定考查,综合知识选择题目中有固定分值的考查。本课时内容侧重于对知识点的记忆、理解和应用,按照以往的出题规律,嵌入式系统架构设计基础知识点基本来源于教材内。本课时知识架构如图19.1所示。 一、嵌入式系统发展历程

C++笔记19•数据结构:红黑树(RBTree)•

红黑树 1.简介:         红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍,因而是接近平衡的。 当搜索二叉树退化为单支树时,搜索效率极低,为了使搜索效率高,建立平衡搜索二叉树就需要"平衡树"来解决。上一篇博客介绍了AVL树,这

张飞硬件11~19-电容篇笔记

电容作用 作为源,对后级电路提供能量,对源进行充电。简单讲就是放电和充电。在电路设计中,源往往与负载相隔很远,增加电容就可以起到稳定作用。电容两端的电压不能激变,增加电容可以稳定电压。 电容可以类比为水坝,来让水保持一个供给量稳定。 提供能量时容量要偏大 滤波时容量要偏小 电容特性 电容的电场相吸,正负极电子增多,电场的形成就越快越强大。 相等电量(q)电容越大,则电压值

【C++学习笔记 19】C++中的对象生存周期

对象如何生存在栈上 在C++中,我们每次进入一个作用域时,我们就是在push栈帧。就像把书堆叠起来,将最新的书放在最上层,在这个作用域上创建变量就像在书中写内容,当作用域结束的时候,就把书拿走,此时每个基于栈的变量就结束了。 举个例子 #include <iostream>#include <string>class Entity{public:Entity(){std::cout <

设计模式 19 观察者模式

设计模式 19 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式 文章目录 设计模式 19观察者模式(Observer Pat

2015年1月19日 对阿里巴巴点赞VS拍砖

肖峰说: 1.建立了一个信用体系 2.当认为交易不安全的时候建立了支付宝(担保体系) 3.当认为创业非常危险的时候他提供了一个创业的榜样 马光远说: 1.中国有没有假货跟有没有阿里巴巴没有关系 2.对中国经济的拉动史无前例 3.买东西更便宜了 李银认为 1.阿里巴巴的信用污点至今无法让人放心 2.假货问题 3.安全问题 阿里巴

Unity3D DOTS系列之Struct Change核心机制详解

前言 在Unity3D的DOTS(Data-Oriented Technology Stack)体系中,Struct Change是一个核心的内存管理机制,它涉及对Entity和Component数据的重新排列和内存分配。DOTS通过ECS(Entity Component System)模型,将游戏中的对象(Entity)、属性(Component)和行为(System)分离,以数据驱动的方式

kubernetes视频教程笔记 (19)-代理模式的分类

一、VIP 和 Service 代理     在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。 kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。 在 Kubernetes v1.0 版本,代理完全在 userspace。在 Kubernetes v1.1 版本,新增了

区块链 Fisco bcos 智能合约(19)-区块链性能腾飞:基于DAG的并行交易执行引擎PTE

在区块链世界中,交易是组成事务的基本单元。 交易吞吐量很大程度上能限制或拓宽区块链业务的适用场景,愈高的吞吐量,意味着区块链能够支持愈广的适用范围和愈大的用户规模。 当前,反映交易吞吐量的TPS(Transaction per Second,每秒交易数量)是评估性能的热点指标。 为了提高TPS,业界提出了层出不穷的优化方案,殊途同归,各种优化手段的最终聚焦点,均是尽可能提高交易的并行处理能力