Version: 2023.2
言語: 日本語
Thread Local Storage (TLS) stack allocator
Customize allocators

Thread-safe linear allocator

The worker threads in Unity use a round robin first in, first out (FIFO) algorithm for fast, lock-free allocations of work buffers for jobs. The jobs dispose of the buffers when done.

このアロケーターは、メモリのブロックを確保し、そのブロック内でメモリをリニアに割り当てます。使用可能なブロックはプールに保持されます。1 つのブロックが一杯になると、アロケーターがプールから新しいブロックをフェッチします。ブロック内のメモリが不要になるとアロケーターがそのブロックをクリアし、ブロックは使用可能なブロックのプールに戻ります。割り当てを素早くクリアしてブロックを再び利用可能にし、ジョブが数フレームよりも長く割り当てられたままにならないようにすることが重要です。

ブロックサイズはカスタマイズ可能です。アロケーターは必要に応じて最大 64 ブロックまでの割り当てを行います。

エディターの Fast Thread Shared Temporary Allocators のデフォルト値
エディターの Fast Thread Shared Temporary Allocators のデフォルト値

全てのブロックが使用中の場合、または割り当てがブロックに対して大きすぎる場合、ジョブアロケーターより大幅に低速なメインヒープアロケーターに割り当てがフォールバックします。1 フレームに 1 - 10 個、あるいは数百個の、少数のオーバーフロー割り当ては、(特にロード中は) 問題ありません。フレームごとにオーバーフローの数が増加する場合は、ブロックサイズを大きくしてフォールバック割り当てを回避できます。ただし、(例えばシーンのローディングなどのイベントでのピーク使用量に合わせて) ブロックサイズを大きくしすぎると、再生中に多くのメモリが使用できない状態になる可能性があります。

例:

[ALLOC_TEMP_JOB_4_FRAMES (JobTemp)]
  Initial Block Size 0.5 MB
  Used Block Count 64
  Overflow Count (too large) 0
  Overflow Count (full) 50408

この使用量レポートの例では、アプリケーションに必要なジョブメモリに対して 0.5 MB というブロックサイズは小さすぎたため、アロケーターが一杯になり、そのために多数の割り当てがオーバーフローしました。

ビルドのフレームオーバーフローが十分かどうかを確認するには、ビルドを短時間実行し、続けて長時間実行してください。オーバーフローのカウントが安定していれば、そのオーバーフローはロード中に発生するハイウォーターマーク (最高水準) です。長時間の実行でオーバーフローのカウントが増加する場合は、ビルドがフレーム単位のオーバーフローを処理しています。どちらの場合も、ブロックサイズを大きくしてオーバーフローを減らすことができますが、フレーム単位のオーバーフローと比べてロード中のオーバーフローは重大度の低いものです。

Thread Local Storage (TLS) stack allocator
Customize allocators