文章目录
- 一.创建方式如下图:
- 二.开启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()
{
//创建JobSystem
ParallelJob 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帧