【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor

embedded/2025/1/2 22:18:12/

        IJob:开启单个线程进行计算,线程内不允许对同一个数据进行操作,也就是如果你想用多个IJob分别计算,将其结果存储到同一个NativeArray<int>数组是不允许的,所以不要这样做,如下例子就是反面教材,应该直接用一个IJob去进行for循环,将结果存储到传入的NativeArray<int>。

using System.Collections.Generic;
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;public class MyJob : MonoBehaviour
{//public List<int> intArray;//public void Start()//{//    intArray = new List<int>();//    for (int i = 0; i < 100; i++)//    {//        for (int j = 0; j < 100; j++)//        {//            intArray.Add(i * j);//        }//    }//}void Start(){List<NativeArray<int>> map = new List<NativeArray<int>>();NativeArray<int> tempArray = new NativeArray<int>(10000, Allocator.TempJob);//处理多个Job时需要缓存JobHandle for之外执行Complete,单个时可以直接 jobHandle.Complete(); NativeList<JobHandle> jobHandles = new NativeList<JobHandle>(Allocator.Temp);for (int i = 0; i < 100; i++){for (int j = 0; j < 100; j++){map.Add(new NativeArray<int>(1, Allocator.TempJob));SingleJob singleJob = new SingleJob() { i = i, j = j, result = map[i * 100 + j] };JobHandle jobHandle = singleJob.Schedule();jobHandles.Add(jobHandle);}}JobHandle.CompleteAll(jobHandles);Debug.Log(map[20 * 100 + 30][0]);jobHandles.Dispose();tempArray.Dispose();foreach (var v in map){v.Dispose();}map.Clear();}[BurstCompile]public struct SingleJob : IJob{public int i, j;public NativeArray<int> result;public void Execute(){result[0] = i * j;}}
}

IJobParallelFor:进行并行计算移动物体的位置信息(帧数在35左右)

using System.Collections.Generic;
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;
using UnityEngine;public class MyJob : MonoBehaviour
{public GameObject cubePrefab;public List<Transform> cubeTransList;public float time;public int dir = 1;void Start(){for (int i = 0; i < 100; i++){for (int j = 0; j < 100; j++){GameObject go = GameObject.Instantiate(cubePrefab);go.transform.position = new Vector3(i * 2, j * 2, 0);cubeTransList.Add(go.transform);}}}void Update(){MyJobParallelFor myJobParallelFor = new MyJobParallelFor();NativeArray<float3> float3sArray = new NativeArray<float3>(cubeTransList.Count, Allocator.TempJob);for (int i = 0; i < cubeTransList.Count; i++){float3sArray[i] = cubeTransList[i].transform.localPosition;}myJobParallelFor.float3sArray = float3sArray;myJobParallelFor.deltaTime = Time.deltaTime;time += Time.deltaTime;if (time >= 2){dir = dir * -1;time = 0;}myJobParallelFor.dir = dir;JobHandle jobHandle = myJobParallelFor.Schedule(cubeTransList.Count, 10); //10是内核数 (最大会使用到实际CPU内核数)jobHandle.Complete();for (int i = 0; i < cubeTransList.Count; i++){cubeTransList[i].localPosition = float3sArray[i];}float3sArray.Dispose();}//并行执行线程[BurstCompile]public struct MyJobParallelFor : IJobParallelFor{public NativeArray<float3> float3sArray;public float deltaTime;public int dir;//index对应执行传入的数组索引public void Execute(int index){float3sArray[index] += new float3(0, dir * deltaTime, 0);}}
}

若不想使用并行,可以使用IJobFor(并发计算)需修改为如下:

JobHandle jobHandle = default;
jobHandle = myJobParallelFor.Schedule(cubeTransList.Count, jobHandle);
jobHandle.Complete();

 或者并发与并行兼容的,允许并行操作情况下才会进行并行。

JobHandle jobHandle = default;
jobHandle = myJobParallelFor.ScheduleParallel(cubeTransList.Count, 10, jobHandle); //10是内核数 (最大会使用到实际CPU内核数)
jobHandle.Complete();

http://www.ppmy.cn/embedded/150192.html

相关文章

基于华为atlas的车辆车型车牌检测识别

整体分为2个部分&#xff0c;也就是2个模型&#xff0c;车辆检测、车型检测、车牌检测这3个功能是一个基于yolov5的模型实现&#xff0c;车牌识别是基于PaddleOCR中的PP-OCRv3的模型实现。 车辆检测数据集制作&#xff1a; 车辆检测、车型检测、车牌检测的数据集主要从coco数…

【框架篇】Spring MVC 介绍及使用(详细教程)

Spring MVC 介绍 1&#xff0c;MVC 设计模式 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于将应用程序的逻辑分离成三个独立的组件&#xff1a; 模型&#xff08;Model&#xff09;&#xff1a;模型是应用程序的数据和业务逻辑…

WEB攻防-通用漏洞-文件上传-js验证-MIME验证-user.ini-语言特征

目录 定义 1.前端验证 2.MIME验证 3.htaccess文件和.user. ini 4.对内容进行了过滤&#xff0c;做了内容检测 5.[ ]符号过滤 6.内容检测php [] {} ; 7.()也被过滤了 8.反引号也被过滤 9.文件头检测 定义 文件上传漏洞是指攻击者上传了一个可执行文件&#xff08;如木马…

行业分析---造车新势力之零跑汽车

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析---…

torch.nn.Embedding模块介绍

torch.nn.Embedding 是 PyTorch 中的一个嵌入层模块,用于将离散的整数索引(如单词或标记的 ID)映射到连续的密集向量空间中。常用于自然语言处理(NLP)中的词嵌入,但也适用于任何需要将类别数据转换为密集向量表示的场景。 参数说明 torch.nn.Embedding(num_embeddings, …

Junit如何禁用指定测试类,及使用场景

在JUnit中禁用指定测试类可以通过多种方式实现&#xff0c;具体取决于使用的JUnit版本&#xff08;JUnit 4 或 JUnit 5&#xff09;。以下是针对两个版本的详细说明以及它们可能的使用场景&#xff1a; JUnit 4 禁用整个测试类 可以使用Ignore注解来忽略整个测试类。这将导致…

CSS 指南

CSS 指南 介绍 CSS(层叠样式表)是一种用于网页设计的语言,它描述了网页的布局和样式。CSS的工作原理是将样式规则应用于HTML元素,以控制它们在浏览器中的显示方式。本指南将详细介绍CSS的基础知识,包括语法、选择器、样式属性和布局技术。 CSS 语法 CSS的基本语法由选…

WIN11 中已安装 LINUX 子系统出现 WSL 0x80071772 错误的解决方案

#工作记录# 最开始可以直接在管理员身份运行的powershell中运行&#xff1a; #用以下命令来尝试升级到WSL的最新预览版 wsl --update --pre-release 在 Windows 11 系统下使用 WSL&#xff08;Windows Subsystem for Linux&#xff09;来搭建 Linux 子系统&#xff0c;为开发…