Version: Unity 6.0 (6000.0)
言語 : 日本語
スレッドローカルストレージ (TLS) のスタックアロケーター
Unmanaged C# memory

スレッドセーフリニアアロケーター

Unity のワーカースレッドは、ラウンドロビン、先入れ先出し (FIFO) アルゴリズムを使用して、ジョブのワークバッファを高速でロックフリーに割り当てます。ジョブは、完了するとバッファを破棄します。

このアロケーターは、メモリブロックを割り当て、それらのブロック内でメモリを順に割り当てます。使用可能なブロックはプールに保持されます。1 つのブロックがいっぱいになると、アロケーターはプールから新しいブロックを取得します。アロケーターはブロック内のメモリが不要になると消去し、ブロックは使用可能なブロックのプールに戻ります。割り当てを迅速に消去してブロックをもう一度使用可能にすることが重要です。ジョブが数フレーム以上割り当てられたままになってはいけません。

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

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

すべてのブロックが使用中の場合、または割り当てがブロックに対して大きすぎる場合、割り当てはメインヒープアロケーターにフォールバックします。これは、ジョブアロケーターよりもはるかに低速です。割り当てに多少のオーバーフローが発生しても問題ありません。フレームごとに 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 のブロックサイズでは小さすぎたため、アロケーターがいっぱいになり、多数の割り当てがオーバーフローしました。

ビルドのフレームオーバーフローが問題ないかどうかを調べるには、短期間実行してから長期間実行します。オーバーフローカウントが一定の場合、ロード中に上限に達してオーバーフローが発生しています。実行時間が長くなるにつれてオーバーフローカウントが増加する場合、ビルドはフレームごとのオーバーフローを処理しています。どちらの場合もブロックサイズを大きくしてオーバーフローを減らすことができますが、ロード中のオーバーフローはフレームごとのオーバーフローよりも危険ではありません。

スレッドローカルストレージ (TLS) のスタックアロケーター
Unmanaged C# memory