unity jobSystem

什么是jobSystem

一个多线程系统,可以利用cpu多核,提高程序运行的帧率。

如何使用

创建任务
  1. 创建struct 实现Ijob接口
  2. 添加变量
  3. 实现接口方法
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 类型的定义

调用任务
  1. 实列化job
  2. 设置好数据
  3. 调用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();
    }
}

gitHub下载连接

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;
    }
}

参考连接

unity 官网连接
案列 gitHub下载连接

学习笔记 下载连接
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值