Unity DOTS技术(十四) Job与ParallelJob接口

2024-06-08 14:12

本文主要是介绍Unity DOTS技术(十四) Job与ParallelJob接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一.创建方式如下图:
  • 二.开启Burst编译器
  • 三.创建多个Job
  • 四.数学运算介绍
  • 五.ParallelJob接口
      • 1.传统方式创建
      • 2.使用Parallel来实现对比
      • 3开启Burst编译器对比


这里介绍直接使用Job新的开启线程工作的方式.

在这里插入图片描述

一.创建方式如下图:

这里就开启了一个线程
在这里插入图片描述

二.开启Burst编译器

开启Burst编译可以有效提高编译代码的性能

在这里插入图片描述

三.创建多个Job

这里需要注意的是,同时使用多个全程同时执行完毕,需要用到一个容器NativeList存储JobHandle
使用JobHandle.监听所有线程完成.
以下线程是各自做运算切勿同时操作同一个线程数据
在这里插入图片描述

四.数学运算介绍

4.需要注意的是在此多线程运算中不得使用Unity原有的类库进行运算,应当使用Mathematics进行运算
在这里插入图片描述

五.ParallelJob接口

与Job接口不同 ,假设我们需要在场景中遍历物体时Job接口接口则需要在每个线程中遍历所有的物体.
于是系统为我们提供了ParallelJob接口,为了对比性能我们可以创建10000个Cube并让其旋转,如下图:

1.传统方式创建

在这里插入图片描述

using System.Collections.Generic;
using UnityEngine;
public class TestParallelJob : MonoBehaviour
{public float interval;public GameObject cubePrefab;public List<GameObject> goList = new List<GameObject>();void Start(){Vector3 tempVector3 = new Vector3(-interval, 0, 0);for (int i = 0; i < 100; i++){for (int j = 0; j < 100; j++){GameObject tempCube = GameObject.Instantiate(cubePrefab);tempVector3.x += interval;tempCube.transform.position = tempVector3;goList.Add(tempCube);}tempVector3.x = -interval;tempVector3.y += interval;}}private void Update(){foreach (GameObject go in goList){go.transform.eulerAngles += new Vector3(0, 0, 1);}}
}

可以看到帧率只到了19帧

在这里插入图片描述

2.使用Parallel来实现对比

然后我们再使用Parallel来实现对比
创建ParallelJob并在此做计算
在这里插入图片描述

public struct ParallelJob : IJobParallelFor
{public NativeArray<float3> eulerAngles;public float deltaTime;public void Execute(int index){//此处操作可以根据Index 获得要操作物体eulerAngles[index] += new float3(0, 30 * deltaTime, 0);for (int i = 0; i < 1000; i++){float result = math.exp10(math.sqrt(5 * 6));}}
}

再在Update中装创建JobSystem工作,并用数组记录数据,通过Job计算后回传数据.让Cube旋转
在这里插入图片描述

private void Update()
{//创建JobSystemParallelJob tempParallelJob = new ParallelJob();//创建数组NativeArray<float3> eulerAngles = new NativeArray<float3>(goList.Count, Allocator.TempJob);//给数组赋值for (int i = 0; i < goList.Count; i++){eulerAngles[i] = goList[i].transform.eulerAngles;}tempParallelJob.eulerAngles = eulerAngles;tempParallelJob.deltaTime = Time.deltaTime;//参数(数组长度,Job数量)//1.数组长度 : 为操作物体的总数//2.Job数量: 批处理控制将获得多少个Job,级重新分配工作的细化程度JobHandle tempjobHandle = tempParallelJob.Schedule(goList.Count, 10);//等待线程执行完毕tempjobHandle.Complete();for (int i = 0; i < goList.Count; i++){goList[i].transform.eulerAngles = eulerAngles[i];}eulerAngles.Dispose();
}

此时同样是这么些计算而帧率却来到了80+帧
在这里插入图片描述

3开启Burst编译器对比

在JobSystem中使用[BurstCompile]开启Burst编译器可以进一步优化性能
在这里插入图片描述

此时我们的帧率将来到293帧
在这里插入图片描述

这篇关于Unity DOTS技术(十四) Job与ParallelJob接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu