【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();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…

imgproxy图像处理的高效与安全

摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…

CPT203 Software Engineering 软件工程 Pt.4 软件设计(中英双语)

文章目录 6. 设计概念6.1 Principle6.2 Concepts6.2.1 General design concepts&#xff08;常见的设计概念&#xff09;6.2.1.1 Abstraction&#xff08;抽象&#xff09;6.2.1.2 Modularity&#xff08;模块化&#xff09;6.2.1.3 Functional independence&#xff08;功能独…

MultiDiff 论文解读

一、CameraCtrl AnimateDiff->MotionCtrl->CameraCtrl CameraCtrl将多帧图像的Plucker射线输入到Camera Encoder&#xff0c;Plucker射线可以表示每个像素对应的光线方向。 Camera Encoder包括ResNet block和Temporal Attention&#xff0c;来提取每一帧相机位姿的时序…

OpenCV-Python实战(4)——图像处理基础知识

一、坐标 在 OpenCV 中图像左上角坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;竖直向下为 Y&#xff08;height&#xff09; &#xff1b;水平向右为 X&#xff08;width&#xff09;。 二、生成图像 2.1 灰度图像 img np.zeros((h,w), dtype np.uint8) i…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…

html转PDF

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中会有一些需要页面转成PDF的情况&#xff0c;这里需要配合一些插件可以完成 使用html2canvas将使用canvas将页面转为base64图片流&#xff0c;并插入jspdf插件中&#xff0c;保存并下载pdf。…

32132132123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

微服务保护-sentinel

为什么要有微服务保护&#xff1f; 微服务保护是为了避免微服务雪崩而出现的&#xff0c;每个微服务能处理的请求是有限的&#xff0c;如果一个微服务出现问题导致一个请求进入微服务的时间太久&#xff0c;就会导致大量去请求停滞在微服务内部&#xff0c;这样就会过分占用系统…

深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致&#xff01; 比如将 UserDao 改名为 UserMapper 运行发现抱错&#xff0c;这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口&#xff0c;接下来一一对…

【LLM综述】29种大模型Prompt Engineering技术

note 从零样本&#xff08;Zero-shot&#xff09;提示到最新进展的各种提示技术&#xff0c;包括推理和逻辑链&#xff08;Chain-of-Thought, CoT&#xff09;提示、自动链式思考&#xff08;Auto-CoT&#xff09;提示、自我一致性&#xff08;Self-Consistency&#xff09;提…

【Java基础-29】深入理解Java中的super关键字:用法、场景与最佳实践

在Java编程中&#xff0c;super关键字是一个非常重要的概念&#xff0c;尤其在继承和多态的上下文中。它用于访问父类的成员&#xff08;属性、方法或构造函数&#xff09;&#xff0c;帮助开发者在子类中更好地管理和扩展父类的功能。本文将深入探讨super关键字的用法、适用场…

linux-软硬链接

我们今天再来聊一下这个"软硬链接"的问题. 目录 1. 软硬链接长什么样?2. 软连接和硬链接的特征 和 应用2.1 软连接特征 及其 应用?①软连接是什么?②软连接的应用1: 快捷方式③软连接的应用2: 方便维护库文件 2.2 硬连接特征 及其 应用?①硬链接是什么?②引用计…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CircleGeometry 圆形…

ISO/IEC 25012:2008 系统和软件的质量模型(数据质量模型)

本文是对GBT 25000.12-2017《软件产品系统与软件质量要求与评价&#xff08;SQuaRE&#xff09;第12部分&#xff1a;数据质量模型》一文的转载&#xff0c;此外还参考了ISO/IEC 25012:2008(en) Software engineering — Software product Quality Requirements and Evaluation…

鸿蒙开发工程师成长的五个阶段

在科技日新月异的今天&#xff0c;鸿蒙&#xff08;HarmonyOS&#xff09;作为华为自主研发的操作系统&#xff0c;正以其独特的魅力和广阔的应用前景吸引着越来越多的开发者加入。鸿蒙不仅承载着华为对未来智能设备互联互通的愿景&#xff0c;也为开发者提供了一个充满挑战与机…

torch.nn.LSTM介绍

torch.nn.LSTM 是 PyTorch 提供的一个高级封装,用于构建长短时记忆网络(LSTM)。相比手动实现,torch.nn.LSTM 更高效且支持批量处理、双向 LSTM、多层 LSTM 等功能,适合大多数实际应用。 LSTM基本原理 门控机制(Gating Mechanism)是深度学习中常见的一种设计,用于控制信…

termux-boot安卓开机自动启动应用

termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口&#xff08;图中app为爱玩机工具箱&#xff09; 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现&#xff1a;显示页面 前端实现&#xff1a;显示购物车信息 分析 用户如果没有登录&#xff0c;购物车存放在浏览器端的localStorage处&#xff0c;且以数组的方式进行存储。用户如果登录了&#xff0c;购物车存放在redis中&#xff0c…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中&#xff0c;小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后&#xff0c;肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法&#xff0c;将大量…