【Unity3D】ECS入門學習(十二)IJob、IJobFor、IJobParallelFor

????????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.pswp.cn/web/64662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64662.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring 創建和管理 Bean 的原理,以及Spring 的單例模式是否線程安全?(有無狀態Bean)

Spring 是一個輕量級的開源框架&#xff0c;廣泛應用于 Java 企業級應用的開發。它提供了一個全面的、基于 IOC&#xff08;控制反轉&#xff09;和 AOP&#xff08;面向切面編程&#xff09;的容器&#xff0c;可以幫助開發者更好地管理應用程序中的對象。 Spring 創建和管理…

Docker容器鏡像制作

Docker鏡像的基本概念 1. 什么是Docker鏡像&#xff1f; Docker鏡像是一種輕量級、可執行的軟件包&#xff0c;包含運行某個應用所需的所有代碼、庫、依賴項和配置文件。它的形成是一種“打包”和“快照”過程&#xff0c;使得應用能夠在不同環境中保持一致的功能表現。 2. …

InfoNCE Loss詳解(上)

引言 InfoNCE對比學習損失是學習句嵌入繞不開的知識點&#xff0c;本文就從頭開始來探討一下它是怎么來的。 先驗知識 數學期望與大數定律 期望(expectation&#xff0c;expected value&#xff0c;數學期望&#xff0c;mathematical expectation)是隨機變量的平均值&#…

.Net加密與Java互通

.Net加密與Java互通 文章目錄 .Net加密與Java互通前言RSA生成私鑰和公鑰.net加密出數據傳給Java端采用java方給出的公鑰進行加密采用java方給出的私鑰進行解密 .net 解密來自Java端的數據 AES帶有向量的AES加密帶有向量的AES解密無向量AES加密無向量AES解密 SM2(國密)SM2加密Sm…

工作中常用Vim的命令

Hi, 我是你們的老朋友&#xff0c;主要專注于嵌入式軟件開發&#xff0c;有興趣不要忘記點擊關注【碼思途遠】 目錄 0. ctags -R 1.認識 Vim的幾種工作模式 2.高頻使用命令 2.1 修改文件 2.2 關于行號 2.3 刪除多行&#xff0c;刪除部分 2.4 復制粘貼 2.5 光標移動 2.…

如何在 Vue 2 中使用 Swiper 5.4.5 處理靜態與后端數據不能切換問題

一、文章大綱 1.前言 介紹 Swiper 作為一款強大的輪播組件,常用于處理圖片、文章、商品等內容的滑動展示。 在 Vue.js 項目中集成 Swiper,尤其是在 Vue 2 中使用,常見的兩種數據來源:靜態數據與后端數據。 在 Vue 2 項目中集成 Swiper 5.4.5 2.如何通過 npm 安裝 Swiper…

究極炫酷3D立方體宇宙

演示動畫&#xff1a;https://life.mdjsjd.me/2024/12/27/3d-cube-animation/ 一個使用Python和Pygame制作的炫酷3D立方體動畫效果。結合了多種視覺特效,包括: 動態旋轉的3D立方體炫彩漸變的顏色系統星空背景粒子效果動態殘影拖尾效果深度透視投影 主要特性 動態變換: 立方…

什么是 Azure OpenAI ?了解微軟 Azure OpenAI 和 OpenAI 的關系

一、什么是Azure OpenAI &#xff1f; 微軟已與 OpenAI 合作以實現三個主要目標&#xff1a; ?利用 Azure 的基礎結構&#xff08;包括安全性、合規性和區域可用性&#xff09;&#xff0c;幫助用戶構建企業級應用程序。 ?在微軟產品&#xff08;包括 Azure AI 產品以及以外…

Linux day 1129

家人們今天繼續學習Linux&#xff0c;ok話不多說一起去看看吧 三.Linux常用命令 3.1 Linux命令體驗 3.1.1 常用命令演示 在這一部分中&#xff0c;我們主要介紹幾個常用的命令&#xff0c;讓大家快速感 受以下 Linux 指令的操作方式。主要包含以下幾個指令&#xff1a; ls命…

mysql8 從C++源碼角度看 Statement cancelled due to timeout or client request異常

##Statement cancelled due to timeout or client request 異常 Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client requestat com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1932)at …

【數據結構-單調隊列】力扣1438. 絕對差不超過限制的最長連續子數組

給你一個整數數組 nums &#xff0c;和一個表示限制的整數 limit&#xff0c;請你返回最長連續子數組的長度&#xff0c;該子數組中的任意兩個元素之間的絕對差必須小于或者等于 limit 。 如果不存在滿足條件的子數組&#xff0c;則返回 0 。 示例 1&#xff1a; 輸入&#x…

SAP HCM 標準報表與前臺操作的增強差異邏輯分析(rhgrenz4)

導讀 增強差異:SAP的HCM模塊組織和人事增強都有標準的增強點&#xff0c;不管你調用標準的函數還是前臺操作都會觸發對應的增強。所以很多業務不需要考慮那么多分散點&#xff0c;只要找到一個合適的增強點&#xff0c;就能解決很多和外圍系統集成的業務邏輯&#xff0c;今天遇…

【Spring】Spring DI(依賴注入)詳解——自動裝配——手動裝配與自動裝配的區別

在spring開發中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是實現松耦合和高內聚設計的重要模式。它使得對象的創建和管理與其依賴關系分離&#xff0c;從而提高了代碼的可維護性、可測試性和靈活性。Spring框架通過IoC&#xff08;控制反…

EZ-USB? FX3 USB 5 Gbps 外設控制器

EZ-USB? FX3 USB 5 Gbps 外設控制器 EZ-USB? FX3 提供 USB 5Gbps 至 32 位數據總線&#xff0c;并配備 ARM9&#xff0c;可為任何系統添加 USB 3.0 連接 英飛凌的 EZ-USB? FX3 是業界用途最廣泛的 USB 外圍設備控制器&#xff0c;可以為幾乎任何系統添加 USB 5Gbps 連接。 …

【數據倉庫】spark大數據處理框架

文章目錄 概述架構spark 架構角色下載安裝啟動pyspark啟動spark-sehll啟動spark-sqlspark-submit經驗 概述 Spark是一個性能優異的集群計算框架&#xff0c;廣泛應用于大數據領域。類似Hadoop&#xff0c;但對Hadoop做了優化&#xff0c;計算任務的中間結果可以存儲在內存中&a…

數據庫容災備份的意義+分類+執行工具!

數據庫容災解決方案的背景 數據庫容災&#xff08;Disaster Recovery&#xff0c;DR&#xff09;解決方案的背景主要源于企業對數據安全性、業務連續性和系統高可用性的需求。隨著數字化轉型的加速&#xff0c;企業的數據量迅猛增長&#xff0c;數據庫已成為支撐核心業務的關鍵…

PDF怎么壓縮得又小又清晰?5種PDF壓縮方法

PDF 文件在日常辦公與學習中使用極為頻繁&#xff0c;可想要把它壓縮得又小又清晰卻困難重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、圖像、矢量圖等多樣元素&#xff0c;壓縮時難以兼顧不同元素特性&#xff0c;稍不注意&#xff0c;文字就會…

SpringBoot數據字典字段自動生成對應code和desc

效果&#xff1a;接口會返回orderType&#xff0c;但是這個orderType是枚舉的類型&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff09;&#xff0c;我想多返回一個orderTypeDesc給前端展示&#xff0c;這樣前端就可以直接拿orderTypeDesc使用了。 1. 定義注解 …

【YashanDB知識庫】imp導入數據庫時,報錯YAS-08023

本文內容來自YashanDB官網&#xff0c;原文內容請見 https://www.yashandb.com/newsinfo/7849010.html?templateId1718516 **【問題分類】**數據導入導出 **【關鍵字】**imp、YAS-08023 【問題描述】 導出數據庫時&#xff0c;使用以下命令&#xff0c;導出正常&#xff1…

又一年。。。。。。

2024&#xff0c;渾渾噩噩的一年。 除了100以內的加減法&#xff08;數據&#xff0c;數據&#xff0c;還是數據。。。。。。&#xff09;&#xff0c;似乎沒做些什么。 臉盲癥越來越重的&#xff0c;怕是哪天連自己都不認得自己的了。 看到什么&#xff0c;聽到什…