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

相关文章

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

python协程实现高并发的技术详解

《python协程实现高并发的技术详解》协程是实现高并发的一种非常高效的方式,特别适合处理大量I/O操作的场景,本文我们将简单介绍python协程实现高并发的相关方法,需要的小伙伴可以了解下... 目录核心概念与简单示例高并发实践:网络请求协程如何实现高并发:核心技术协作式多任务与事件循环非阻塞I/O与连接

python调用dubbo接口的实现步骤

《python调用dubbo接口的实现步骤》本文主要介绍了python调用dubbo接口的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录 ​​其他实现方式与注意事项​​ ​​高级技巧与集成​​用 python 提供 Dubbo 接口

Java中接口和抽象类的异同以及具体的使用场景

《Java中接口和抽象类的异同以及具体的使用场景》文章主要介绍了Java中接口(Interface)和抽象类(AbstractClass)的区别和联系,包括相同点和不同点,以及它们在实际开发中的具体使... 目录一、接口和抽象类的 “相同点”二、接口和抽象类的 “核心区别”关键区别详解(避免踩坑)三、具体使

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec