您的位置:首页 > 新闻 > 会展 > 外贸营销单页网站_二维码如何制作_seo快排技术教程_电商运营工作内容

外贸营销单页网站_二维码如何制作_seo快排技术教程_电商运营工作内容

2025/1/8 16:00:45 来源:https://blog.csdn.net/qq_39574690/article/details/144803985  浏览:    关键词:外贸营销单页网站_二维码如何制作_seo快排技术教程_电商运营工作内容
外贸营销单页网站_二维码如何制作_seo快排技术教程_电商运营工作内容

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com