什么是jobSystem
一个多线程系统,可以利用cpu多核,提高程序运行的帧率。
如何使用
创建任务
- 创建struct 实现Ijob接口
- 添加变量
- 实现接口方法
example: IJob
public struct MyJob : IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
//example: IJobParallelFor
struct myParalleForJobs : IJobParallelFor
{
[ReadOnly]
public float a;
[ReadOnly]
public float b;
public NativeArray<float> result;
public void Execute(int index)
{
result[index] = index + a + b;
}
}
注意:MyJob里面只能是blittable 类型的数据,或者unity的NativeContainer
blitable 类型的定义
调用任务
- 实列化job
- 设置好数据
- 调用Schedule方法
//1. 实列化job
MyJob jobData = new MyJob();
// 2. 设置好数据
jobData.a = 10;
jobData.b = 10;
jobData.result = result;
//3. 调用Schedule方法
JobHandle handle = jobData.Schedule();
// 等待完成
handle.Complete();
// 复制出来数据
float aPlusB = result[0];
// 释放内存
result.Dispose();
完整代码
using System.Collections;
using System.Collections.Generic;
using Unity.Jobs;
using UnityEngine;
using Unity.Collections;
struct MyJob : IJob
{
[ReadOnly]
public float a;
[ReadOnly]
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
public class myJobTest : MonoBehaviour
{
// Update is called once per frame
void Update()
{
NativeArray<float> array = new NativeArray<float>(1,Allocator.TempJob);
MyJob job = new MyJob();
job.a = 1;
job.b = 3;
job.result = array;
JobHandle handle = job.Schedule();
handle.Complete();
var data = job.result[0];
Debug.LogError(data);
array.Dispose();
}
}
job接口有那些
目前接口有
- Ijob 单个任务 (git里面的simple1)
- IJobParallelFor 一次执行多个任务 (git里面的simple2)
- IJobParallelForTransform 可以操作transform (git里面的simple3)
NativeContainer
Allocator
NativeArray array = new NativeArray(1,Allocator.TempJob);
- Allocator.Temp
速度最快,在一帧或更短时间内使用,不应该传递引用出去 - Allocator.TempJob
速度中,在4帧内使用,超过4帧会打印警告,一般在小任务中使用 - Allocator.Persistent
速度最慢,有必要可以在整个app生命周期
使用完成之后需要调用 Dispose方法释放内存
对只读数据使用ReadOnly
对只读数据使用ReadOnly 可以提供程序性能,对只读的数据可以并行执行
struct MyJob : IJob
{
[ReadOnly]
public float a;
[ReadOnly]
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
参考连接
学习笔记 下载连接