Unity C# Job System を使用する場合は、以下を確認してください。
ジョブから静的データにアクセスすると、すべての安全システムが回避されます。誤ったデータにアクセスすると Unity をクラッシュさせることがあり、多くの場合予期せぬことが起こります。例えば、MonoBehaviour にアクセスすると、ドメインのリロード時にクラッシュする可能性があります。
注意 このリスクのため、今後のバージョンの Unity では 静的コード分析 を使用して、ジョブからグローバル変数へのアクセスを禁止します。もし、ジョブ内の静的データにアクセスすると、今後のバージョンの Unity では、コードが壊れることが予想されます。
ジョブの実行を始めたい場合は、スケジュールされたバッチを JobHandle.ScheduleBatchedJobs でフラッシュします。このメソッドを呼び出すとパフォーマンスに悪影響を与える可能性があることに注意してください。バッチをフラッシュしないと、メインスレッドが結果を待つまでスケジュールが遅延します。それ以外の場合は、JobHandle.Complete を使用して実行プロセスを開始します。
注意 Entity Component System(ECS) ではバッチは暗黙的にフラッシュされるため、JobHandle.ScheduleBatchedJobs
の呼び出しは必要ありません。
参照戻り値 (ref return) がないため、直接 NativeContainer のコンテンツを変更することはできません。例えば、nativeArray[0]++;
は var temp = nativeArray[0]; temp++;
と書くのと同じです。 これは nativeArray
の値を更新しません。
代わりに、インデックスのデータからローカルの一時的なコピーを作成し、そのコピーを変更して、それを元のデータに保存する必要があります。以下のように行ないます。
MyStruct temp = myNativeArray[i];
temp.memberVariable = 0;
myNativeArray[i] = temp;
データの所有権を追跡するには、メインスレッドがそれらを再度使用する前に、依存関係を完了させる必要があります。 JobHandle.IsCompleted を確認するだけでは不十分です。メインスレッドへ NativeContainer
タイプの所有権を取り戻すには、JobHandle.Complete
メソッドを呼び出す必要があります。Complete
を呼び出すと、安全システムの状態もクリーンアップされます。それを行わないと、メモリリークが発生します。この処理は、すべてのフレームに、前のフレームのジョブに依存関係のあるジョブをスケジュールする場合にも適用されます。
Schedule と Complete
はメインスレッドからのみ呼び出すことができます。1 つのジョブが別のジョブに依存している場合はジョブ内にジョブをスケジュールしようとせず、むしろ JobHandle
を使用して依存関係を管理します。
ジョブが必要とするデータを取得したらすぐに、ジョブの Schedule
を呼び出し、結果が必要になるまでそのジョブで Complete
を呼び出してはいけません。実行中の他のジョブと競合していないときに、待機する必要のないジョブをスケジュールすることは適正な方法です。例えば、1 つのフレームの終了から次のフレームの開始までの間でジョブが実行されておらず、1 フレームの待ち時間が許容できる場合は、フレームの最後にジョブをスケジュールし、その結果を次のフレームで使用します。また、ゲームの切り替え部分が他のジョブで飽和状態であるのに、フレーム内の他のどこかで過度にジョブの少ない部分がある場合は、ジョブを少ない部分にスケジュールする方が効率的です。
ジョブはデフォルトで NativeContainer
タイプへの読み書きのアクセスを持っていることに注意してください。適時 [ReadOnly]
属性を使用して、パフォーマンスを向上させます。
Unity の Profiler ウィンドウで、メインスレッドのマーカー “WaitForJobGroup” は、Unity がワーカースレッドのジョブを完了するのを待っていることを示しています。このマーカーは、解決する必要があるデータの依存関係がどこかに存在することを意味します。メインのスレッドを強制的に待機させているデータの依存関係を追跡するには、JobHandle.Complete
を探してください。
ジョブには Run 関数があり、 Schedule
の代わりに使用してメインスレッド上でジョブを即座に実行することができます。これはデバッグの目的で使用できます。
マネージメモリをジョブに割り当てると非常に遅く、パフォーマンスを向上させるために Unity Burst コンパイラー を使用することはできません。Burst は作業をより簡単にする新しい LLVM ベースのバックエンドコンパイラー技術です。C# のジョブを処理し、高度に最適化されたマシンコードを生成し、プラットフォームの特定の機能を活用できます。
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.