Unity 6.3
0 онлайн 96 гостей 3 в системе
Вход
Оптимизация Шаг 19 из 208

Пример распределителя контейнеров

Предварительные условия

В примерах используются отчеты об использовании памяти, которые записываются в журнал при закрытии Player или Unity Editor. Для создания этих отчетов используйте аргумент командной строки -log-memory-performance-stats. Чтобы найти файлы журнала проекта, следуйте инструкциям на странице файлов журнала.

Пример конфигурации

Выделяющий контейнер резервирует блоки памяти для выделения. Каждый блок разделен на подсекции по 16 KB. Следующий пример конфигурации демонстрирует процесс резервирования блоков для выделения:

Общий распределитель bucket для Windows, macOS и Linux Player
Общий распределитель bucket для Windows, macOS и Linux Player

В этой конфигурации общий размер блока (Размер блока распределителя контейнеров) составляет 4 MB, а гранулярность выделений (Гранулярность распределителя контейнеров) составляет 16 байт. Первый размер выделения, для которого создаются контейнеры, составляет 16 байт, второй — 32 байта (2 * 16), затем 48 байт, 64 байта, 80 байт, 96 байт, 112 байт и 128 байт, в общей сложности восемь контейнеров (Распределитель контейнеров BucketCount).

Каждый подраздел содержит разное количество контейнеров. Чтобы рассчитать количество контейнеров в подразделе, разделите размер подраздела (16 KB) на размер гранулирования. Например:

  • Когда гранулярность выделения составляет 64 байта, в подраздел входит 256 контейнеров.
  • Когда гранулярность выделения составляет 16 байт, в подраздел входит 1024 контейнера.

Сравнение сборки разработки и выпуска

Распределители bucket создают разные отчеты об использовании для сборки разработки и сборки выпуска, потому что в сборке разработки каждое распределение имеет дополнительный заголовок 40 байт. На следующей диаграмме показана разница между сборками разработки и выпуска для 16-байтных и 64-байтных распределений:

Сравнение сборок для разработки и выпуска
Сравнение сборок для разработки и выпуска

Заголовок является причиной, по которой распределитель сообщает о полноте после выделения только 2 MB из его 4 MB:

[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 2.0 MB
      Failed Allocations. Bucket layout:
        16B: 64 Subsections = 18724 buckets. Failed count: 3889
        32B: 17 Subsections = 3868 buckets. Failed count: 169583
        48B: 31 Subsections = 5771 buckets. Failed count: 39674
        64B: 28 Subsections = 4411 buckets. Failed count: 9981
        80B: 17 Subsections = 2321 buckets. Failed count: 14299
        96B: 6 Subsections = 722 buckets. Failed count: 9384
        112B: 44 Subsections = 4742 buckets. Failed count: 5909
        128B: 49 Subsections = 4778 buckets. Failed count: 8715

В сборке выпуска для того же проекта размер блока распределителя достаточен:

[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 3.3 MB

В отчете об использовании отображаются статистические данные об использовании, в том числе о количестве неудачных выделений. Если в отчете отображается число неудачных выделений, которое увеличивается линейным образом, вероятно, что неудачные выделения происходят при расчете кадров, а не нагрузки. Резервные выделения не являются проблемой для нагрузки сцены, но могут повлиять на производительность, если они происходят при расчете кадров.

Чтобы предотвратить эти резервные выделения, увеличьте размер блока и ограничьте новый размер блока, чтобы он соответствовал пику использования кадров, а не пику использования загрузки сцены. Это предотвращает увеличение блока настолько, что он резервирует много памяти, которая затем не доступна во время выполнения.

Совет: Распределители Profiler совместно используют экземпляр распределителя bucket. Вы можете настроить этот общий экземпляр в параметре Profiler Общий распределитель bucket.

Дополнительные ресурсы