本文主要是介绍Unity DOTS技术(十四) Job与ParallelJob接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一.创建方式如下图:
- 二.开启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()
{//创建JobSystemParallelJob 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帧
这篇关于Unity DOTS技术(十四) Job与ParallelJob接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!