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

news2025/1/19 20:39:46

文章目录

  • 一.创建方式如下图:
  • 二.开启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()
{
    //创建JobSystem
    ParallelJob 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帧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1801805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】Softmax回归探索

从零开始探索Softmax回归&#xff1a;深度学习的入门之旅 一、Softmax回归的原理与关键步骤二、研究准备&#xff1a;GPU环境下的PyTorch安装与配置三、研究内容&#xff1a;使用PyTorch实现Softmax回归 随着人工智能和机器学习的迅猛发展&#xff0c;深度学习技术逐渐成为了科…

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制&#xff08;Multi-Head Attention&#xff09;具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…

搭建数字化营销平台带来的一系列积极影响!

在当今数字化时代&#xff0c;搭建数字化营销平台具有一系列令人瞩目的积极影响。 这种平台的搭建&#xff0c;能够有力地促进形成良好的产业生态。就如同搭建蚓链数字化生态营销系统这般&#xff0c;它强化了产业间的沟通与协作&#xff0c;使得各个环节紧密相连&#xff…

【MMU】——MMU 权限控制

文章目录 权限控制内存访问权限内存类型XN execute neverDomain 权限控制 内存访问权限 内存类型 TEX C B bit 控制信息 XN execute never 不可执行区域&#xff0c;例如设备地址空间通常标记为不可执行区域&#xff0c;如果有指令预取访问了该空间&#xff0c;就会触发指令…

个人博客的未来出路在哪里?

说起个人博客的未来这就是个悲伤的话题,估计不少个人博客站长们都在苦苦的坚持和挣扎着吧,反正明月这两年感受最深刻的就是又有不少个人博客站点停更和 404 了都。自从坚持写博客这近十来年这种情况也都见怪不怪了,但这两年最突出的就是很多站长都是迷茫和悲观。 明月去年在…

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址&#xff1a; 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准&#xff0c;没有组…

『 Linux 』目录与软硬链接 (万字详解)

文章目录 如何理解目录目录项 目录中的权限问题根目录Dentry缓存文件的增删改查与文件系统关系软硬链接软链接硬链接 如何理解目录 目录是一个文件存在其对应独立的Inode; $ stat dirFile: ‘dir’Size: 4096 Blocks: 8 IO Block: 4096 directory Device: f…

数据结构:一般哈希

数据结构&#xff1a;一般哈希 题目描述参考代码拉链法开放寻址法 题目描述 输入样例 5 I 1 I 2 I 3 Q 2 Q 5输出样例 Yes No参考代码 拉链法 #include <iostream> #include <cstring> using namespace std;const int N 100003;int h[N], e[N], ne[N], idx;vo…

docker实战命令大全

文章目录 1 环境准备1.1 移除旧版本Docker1.2安装工具包1.3配置docker yum源 2 安装最新docker2.1 设置开机自启docker2.2配置加速器 3 实操-镜像3.1搜索镜像3.2下载镜像3.3查看镜像3.4 删除镜像 4 实操-容器4.1运行nginx容器4.2 查看容器4.3启动容器4.5关闭容器4.6查看容器日志…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

2024年AI大模型训练数据白皮书作用

2024年AI大模型训练数据白皮书 在人工智能迅猛发展的今天&#xff0c;AI大模型的训练数据质量和管理成为影响其性能和应用效果的关键因素。《2024年AI大模型训练数据白皮书》为业内人士提供了一份详尽的指南&#xff0c;揭示了当前AI大模型训练数据的最新趋势、最佳实践以及未…

通州公司代理记账,以专业服务提升企业运营效率

我们为您提供“通州公司代理记账”的全面信息&#xff0c;作为一家专业的代理记账机构&#xff0c;我们的目标是为您的企业提供最优质的服务&#xff0c;帮助您更高效地管理财务。 代理记账是一项重要的商业活动&#xff0c;它不仅可以帮助企业节约时间和成本&#xff0c;而且…

逻辑这回事(三)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…

使用 Elasticsearch 调用 OpenAI 函数

作者&#xff1a;来自 Elastic Ashish Tiwari 介绍 OpenAI 中的函数调用是指 AI 模型与外部函数或 API 交互的能力&#xff0c;使它们能够执行文本生成之外的任务。此功能使模型能够通过调用预定义函数来执行代码、从数据库检索信息、与外部服务交互等。 该模型根据用户提示智…

【核心动画-转场动画-CATransition Objective-C语言】

一、转场动画,CATransition, 1.接下来,我们来说这个转场动画啊,效果呢,会做这么一个小例子, 感觉有一个3D的一个样式一样, 转场动画呢,就是说,你在同一个View,比如说,imageView,去切换图片的时候,你可以去用这个,转场动画, 实际上,包括,控制器之间的切换,也…

【WEB系列】过滤器Filter

Filter&#xff0c;过滤器&#xff0c;属于Servlet规范&#xff0c;并不是Spring独有的。其作用从命名上也可以看出一二&#xff0c;拦截一个请求&#xff0c;做一些业务逻辑操作&#xff0c;然后可以决定请求是否可以继续往下分发&#xff0c;落到其他的Filter或者对应的Servl…

微服务架构-正向治理与治理效果

目录 一、正向治理 1.1 概述 1.2 效率治理 1.2.1 概述 1.2.2 基于流量录制和回放的测试 1.2.3 基于仿真环境的测试 1.3 稳定性治理 1.3.1 概述 1.3.2 稳定性治理模型 1.3.3 基于容器化的稳定性治理 1.3.3.1 概述 1.3.3.2 测试 1.3.3.3 部署 1.3.3.3.1 概述 1.3.3…

零基础入门学用Arduino 第一部分(三)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

添加west扩展命令

使用west工具的帮助命令&#xff0c;west -h&#xff0c;不仅可以列出west工具的内置命令&#xff0c;也可以列举当前工程中实现的扩展命令&#xff0c;如build&#xff0c;flash等。 本文将介绍如何添加扩展命令。 west扩展命令的位置通过以下方式查找&#xff1a; 1. 首先找…

网络编程之XDP技术介绍

一、简介 XDP&#xff1a;eXpress Data Path&#xff0c;快速数据面&#xff0c;听名字是不是很高大上。其实它就是一个快速处理Rx数据包的数据面技术。为什么现在对数据处理如此敏感&#xff1f;原因非常简单&#xff0c;随着网络的不断覆盖社会的各个层面&#xff0c;海量的…