Version: Unity 6.0 (6000.0)
言語 : 日本語
バケットアロケーター
スレッドセーフリニアアロケーター

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

各スレッドは、一時的な割り当てに独自の高速スタックアロケーターを使用します。これらの割り当ては非常に高速で、生存期間は 1 フレーム未満です。アロケーターは後入れ先出し (LIFO) スタックを使用します。

一時アロケーターのデフォルトブロックサイズは、プラットフォームで 4 MB、Unity エディターで 16 MB です。これらの値はカスタマイズできます。

ノート: 設定されたブロックサイズをアロケーターの使用が超える場合、Unity によってブロックサイズが増やされます。この増加には制限があり、元のサイズの 2 倍までです。

スレッドごとの高速一時アロケーターのメインスレッドブロックサイズのカスタム値
スレッドごとの高速一時アロケーターのメインスレッドブロックサイズのカスタム値

スレッドのスタックアロケーターが満杯になると、割り当てはスレッドセーフリニアアロケーターにフォールバックします。割り当てに多少のオーバーフローが発生しても問題ありません。フレーム内で 1 - 10、ロード中に数百程度なら大丈夫です。ただし、フレームごとの数字が大きくなる場合は、ブロックサイズを増やすことができます。

アプリケーションに適したブロックサイズの選択には、使用状況レポートの情報が役立ちます。例えば、以下のメインスレッドの使用状況レポートでは、ロードのピークは 2.7 MB ですが、残りのフレームは 64 KBを下回っています。ブロックサイズを 4 MB から 64 KB に縮小し、ロード中のフレームで割り当てを超過できるようにすることができます。

[ALLOC_TEMP_TLS] TLS Allocator
  StackAllocators :
    [ALLOC_TEMP_MAIN]
      Peak usage frame count: [16.0 KB-32.0 KB]: 802 frames, [32.0 KB-64.0 KB]: 424 frames, [2.0 MB-4.0 MB]: 1 frames
      Initial Block Size 4.0 MB
      Current Block Size 4.0 MB
      Peak Allocated Bytes 2.7 MB
      Overflow Count 0
    [ALLOC_TEMP_Job.Worker 18]

この 2 番目の例では、ワーカースレッドは大規模な一時割り当てには使用されません。メモリを節約するには、ワーカーのブロックサイズを 32 KB に縮小します。これは、各ワーカースレッドに独自のスタックがあるマルチコアマシンで特に便利です。

[ALLOC_TEMP_Job.Worker 14]
      Initial Block Size 256.0 KB
      Current Block Size 256.0 KB
      Peak Allocated Bytes 18.6 KB
      Overflow Count 0
バケットアロケーター
スレッドセーフリニアアロケーター