Unity3D :JobHandle 和依赖项
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
JobHandle 和依赖项
调用作业的 Schedule 方法时,将返回 JobHandle。可以在代码中使用 JobHandle
作为其他作业的依赖项。如果一个作业依赖于另一个作业的结果,则可以将第一个作业的 JobHandle
作为参数传递给第二个作业的 Schedule
方法,如下所示:
JobHandle firstJobHandle = firstJob.Schedule();
secondJob.Schedule(firstJobHandle);
注: 作业的所有依赖项都必须在与作业本身相同的控制线程上调度。
合并依赖项
如果一个作业具有许多依赖项,则可以使用 JobHandle.CombineDependencies 方法合并这些依赖项。CombineDependencies
可以将依赖项传递给 Schedule
方法。
NativeArray<JobHandle> handles = new NativeArray<JobHandle>(numJobs, Allocator.TempJob);
// 使用来自多个调度作业的 `JobHandles` 填充 `handles`...
JobHandle jh = JobHandle.CombineDependencies(handles);
在控制线程中等待作业
用于强制代码在控制线程中等待作业完成执行。为此,请在 上调用 Complete 方法。此时,您知道控制线程可以安全地访问作业正在使用的 NativeContainer。JobHandleJobHandle
注: 作业不会在您计划作业时开始执行。如果您正在控制线程中等待作业,并且需要访问作业正在使用的 NativeContainer 数据,则可以调用该方法 。此方法从内存缓存中刷新作业并开始执行过程。调用 会将该作业类型的所有权返回给控制线程。您需要调用 才能再次从控制线程安全地访问这些类型。还可以通过调用来自作业依赖项的 将所有权返回给控制线程。例如,您可以调用 ,也可以调用依赖于 的 。这两者都会产生在调用 后在控制线程上安全访问所使用的类型。JobHandle.CompleteCompleteJobHandleNativeContainerCompleteJobHandleNativeContainerCompleteJobHandleCompletejobACompletejobBjobANativeContainerjobAComplete
否则,如果您不需要访问数据,则需要显式刷新批次。为此,请调用静态方法 JobHandle.ScheduleBatchedJobs。请注意,调用此方法会对性能产生负面影响。
多个作业和依赖项的示例
作业代码:
// 将两个浮点值相加的作业
public struct MyJob : IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
// 将一个值加一的作业
public struct AddOneJob : IJob
{
public NativeArray<float> result;
public void Execute()
{
result[0] = result[0] + 1;
}
}
主线程代码:
// 创建单个浮点数的本机数组以存储结果。此示例等待作业完成
NativeArray<float> result = new NativeArray<float>(1, Allocator.TempJob);
// 设置作业 #1 的数据
MyJob jobData = new MyJob();
jobData.a = 10;
jobData.b = 10;
jobData.result = result;
// 调度作业 #1
JobHandle firstHandle = jobData.Schedule();
// 设置作业 #2 的数据
AddOneJob incJobData = new AddOneJob();
incJobData.result = result;
// 调度作业 #2
JobHandle secondHandle = incJobData.Schedule(firstHandle);
// 等待作业 #2 完成
secondHandle.Complete();
// NativeArray 的所有副本都指向同一内存,您可以在"您的"NativeArray 副本中访问结果
float aPlusB = result[0];
// 释放由结果数组分配的内存
result.Dispose();
由3D建模学习工作室整理翻译,转载请注明出处!