ジョブの 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);
// `handles` に複数のスケジュールされたジョブの `JobHandles` を割り当てます...
JobHandle jh = JobHandle.CombineDependencies(handles);
JobHandle
を使用すると、ジョブの実行が終了するまでメインスレッドのコードを実行するのを強制的に待機させることができます。これを行うには、JobHandle
のメソッド Complete を呼び出します。この時点で、メインスレッドは、ジョブが使っていた NativeContainer に安全にアクセスできます。
注意 ジョブをスケジュールすると、そのままでは実行を開始しません。スケジュールされたジョブがメインスレッドで待機しているときに、ジョブが使用している NativeContainer データにメインスレッドからアクセスする必要がある場合は、JobHandle.Complete
メソッドを呼び出します。このメソッドはメモリキャッシュからジョブをフラッシュし、実行のプロセスを開始します。JobHandle
の Complete
を呼び出すと、そのジョブの NativeContainer
タイプの所有権をメインスレッドに返還します。これらの NativeContainer
タイプにメインスレッドから安全にアクセスするには、JobHandle
の Complete
を呼び出す必要があります。ジョブの依存関係の JobHandle
で Complete
を呼び出すことで、所有権をメインスレッドに返還することも可能です。例えば、 jobA
で Complete
を呼び出すこともできますし、jobA
に依存する jobB
で Complete
を呼び出すこともできます。どちらの場合でも Complete
の呼び出し後に、jobA
が使用していた NativeContainer
タイプに、メインスレッドから安全にアクセス可能になります。
あるいは、データへのアクセスが必要ない場合は、バッチを明示的にフラッシュする必要があります。これを行うには、静的メソッド JobHandle.ScheduleBatchedJobs を呼び出します。このメソッドを呼び出すとパフォーマンスに悪影響を与える可能性があることに注意してください。
ジョブコードサンプル
// 2 つの浮動小数点の値を加算するジョブ
public struct MyJob : IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
// 1 を値に加算するジョブ
public struct AddOneJob : IJob
{
public NativeArray<float> result;
public void Execute()
{
result[0] = result[0] + 1;
}
}
メインスレッドコードサンプル
//結果を保存するために、1 つの float 値を格納できるネイティブの配列を作成します。この例では、説明のためにジョブが完了するのを待ちます。
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 handle = 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();
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.