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

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

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

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