并行处理数据的Job需要继承IJobParallelFor接口,Execute方法也有所变化:
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
struct MyParallelJob : IJobParallelFor
{
[ReadOnly] public NativeArray<float> a;// 如果不需要写入,建议加[ReadOnly]提升性能
[ReadOnly] public NativeArray<float> b;
public NativeArray<float> result;
public void Execute(int i)
{
result[i] = a[i] + b[i];
}
}
public class JobTest : MonoBehaviour
{
private void Start()
{
var a = new NativeArray<float>(2, Allocator.TempJob);
var b = new NativeArray<float>(2, Allocator.TempJob);
var result = new NativeArray<float>(2, Allocator.TempJob);
a[0] = 1.1f;
b[0] = 2.2f;
a[1] = 3.3f;
b[1] = 4.4f;
var jobData = new MyParallelJob() { a = a, b = b, result = result };
var handle = jobData.Schedule(result.Length, 1); // 批次计数较低(这里为1)使线程工作分配更均匀
handle.Complete();
foreach (var item in result)
{
Debug.Log(item);// 3.3 7.7
}
a.Dispose();
b.Dispose();
result.Dispose();
}
}