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建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :调度作业 (mvrlink.com)

下一篇:Unity3D :ParallelFor 作业 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号