動的ヒープアロケーターは、メインのヒープアロケーターで、メモリのブロックにアルゴリズム Two Level Segregated Fit (TLSF) を適用します。
それぞれのプラットフォームにはデフォルトのブロックサイズがあり、このサイズはカスタマイズすることが可能です。この割り当ては、ブロックの 1/2 よりも少なくする必要があります。ブロックの半分以上の割り当ては動的ヒープアロケーターには大きすぎるため、Unity は代わりに仮想メモリ API を使用して割り当てを行います。
動的ヒープアロケーターの使用状況レポートの例:
[ALLOC_DEFAULT_MAIN]
Peak usage frame count: [16.0 MB-32.0 MB]: 497 frames, [32.0 MB-64.0 MB]: 1 frames
Requested Block Size 16.0 MB
Peak Block count 2
Peak Allocated memory 54.2 MB
Peak Large allocation bytes 40.2 MB
この例では、TLSF ブロック サイズは 16 MB に設定され、Unity は 2 つのブロックを割り当てています。アロケーターのピーク使用量は 54.2 MB でした。52.4MB のうち、40.2MB は TLSF ブロックで割り当てられず、代わりに仮想メモリにフォールバックしました。ほとんどのフレームには、16–32 MB のメモリが割り当てられており、1 つのフレーム (おそらくローディングフレーム) が 32–64 MB のメモリでピークに達しました。
ブロックサイズを増やすと、大きな割り当ては仮想メモリにフォールバックせず、動的ヒープに留まります。ただし、そのブロックサイズでは、ブロックが完全に使用されない可能性があるため、メモリの浪費につながる可能性があります。
ヒント: タイプツリーとファイルキャッシュアロケーターは、動的ヒープ割り当てを使用します。このアルゴリズムで使用するメモリブロックを節約したい場合は、タイプツリーのブロックサイズとファイルキャッシュのブロックサイズを 0 に設定します。タイプツリーとキャッシュを使用する割り当ては、代わりにメインのアロケーターにフォールバックします。これはネイティブメモリの断片化が増加するリスクを伴うことに注意してください。これらのブロックサイズの設定方法については、アロケーターのカスタマイズを参照してください。