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

相关文章

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.