包含此页的版本:
不含此页的版本:
当您计划作业时,只能有一个作业执行一项任务。但是,有时您需要对许多对象执行相同的作。为此,请使用 ParallelFor 作业类型,该类型继承自IJobParallelFor.
ParallelFor 作业使用NativeArray作为其数据源的数据。ParallelFor 作业跨多个 CPU 内核运行。每个内核有一个作业,每个作业处理工作负载的子集。
IJobParallelFor行为类似于IJob,而不是单个Execute方法,它调用Execute方法,每个数据源中的每个项一次。中还有一个整数参数索引Execute方法,您可以使用它来访问作业实现中数据源的单个元素并对其进行作。
下面是 ParallelFor 作业定义的示例:
struct IncrementByDeltaTimeJob: IJobParallelFor
{
public NativeArray<float> values;
public float deltaTime;
public void Execute (int index)
{
float temp = values[index];
temp += deltaTime;
values[index] = temp;
}
}
要安排ParallelForjob,则必须指定NativeArray要拆分的数据源。作业系统不知道是哪个NativeArray如果结构中有多个数据源,则要用作数据源。长度还告诉作业系统有多少Execute方法。
在 Unity 的原生代码中,调度ParallelFor工作更复杂。当 Unity 调度ParallelFor作业,作业系统将工作分成批处理,以便在内核之间分配。每个批次都包含Execute方法。然后,作业系统在 Unity 的本机作业系统中为每个 CPU 内核调度一个作业,并将该本机作业传递给批处理以完成。
当本机作业在其他作业之前完成其批处理时,它会从其他本机作业中窃取剩余批处理。它一次只窃取本机作业剩余批次的一半,以确保缓存的局部性。
要优化流程,您需要指定批次计数。批次计数控制您获得的作业数,以及线程之间工作重新分配的细粒度。批次计数较低(例如 1)可在线程之间均匀分配工作。但是,它会带来一些开销,因此有时最好增加批次计数。从 1 开始并增加批次计数,直到性能提升可以忽略不计,这是一个很好的策略。
下面是调度 ParallelFor 作业的示例
职位代码:
// Job adding two floating point values together
public struct MyParallelJob : IJobParallelFor
{
[ReadOnly]
public NativeArray<float> a;
[ReadOnly]
public NativeArray<float> b;
public NativeArray<float> result;
public void Execute(int i)
{
result[i] = a[i] + b[i];
}
}
主线程代码:
NativeArray<float> a = new NativeArray<float>(2, Allocator.TempJob);
NativeArray<float> b = new NativeArray<float>(2, Allocator.TempJob);
NativeArray<float> result = new NativeArray<float>(2, Allocator.TempJob);
a[0] = 1.1f;
b[0] = 2.2f;
a[1] = 3.3f;
b[1] = 4.4f;
MyParallelJob jobData = new MyParallelJob();
jobData.a = a;
jobData.b = b;
jobData.result = result;
// Schedule the job with one Execute per index in the results array and only 1 item per processing batch
JobHandle handle = jobData.Schedule(result.Length, 1);
// Wait for the job to complete
handle.Complete();
// Free the memory allocated by the arrays
a.Dispose();
b.Dispose();
result.Dispose();
一个ParallelForTransformjob 是另一种类型的ParallelFor专为对变换进行作而设计的作业。它对于有效地处理作业中的转换作非常有用。