Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Profiler.GetTotalFragmentationInfo

Объявление

public static long GetTotalFragmentationInfo(NativeArray stats);

Параметры

stats Массив для получения количества свободных блоков, сгруппированных по степени двух размеров. Учитывая небольшой массив, Unity подсчитывает большие свободные блоки вместе в конечном элементе массива.

Возвращает

long Возвращает общее количество свободных блоков в динамической куче.

Описание

Возвращает информацию о фрагментации динамической памяти.

Фрагментация кучи — это показатель того, сколько места в динамической куче потенциально непригодно для использования. Если в вашем приложении слишком много фрагментации кучи, это может привести к сбоям в выделении памяти.

Общая свободная память может быть больше, чем требуется вашему приложению для выделения, но поскольку эта свободная память состоит из двух или более отдельных блоков памяти меньшего размера, выделение может завершиться ошибкой.

Некоторые модели использования памяти во время выполнения могут привести к увеличению количества свободных блоков с течением времени, что приведет к фрагментации кучи.

В качестве примера рассмотрим, когда Unity освобождает большой объем памяти, в кучу возвращается один большой свободный блок. Этот большой свободный блок впоследствии можно было бы использовать для удовлетворения многих других меньших выделений, если меньшие блоки недоступны.

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

Поскольку Unity динамически выделяет и освобождает память, она управляет областью кучи, отслеживая свободные блоки памяти. Внутри Unity группирует эти свободные блоки памяти в списки одинакового размера — сгруппированные по степени двойки, от одной степени двойки до следующей, а именно [ (2^n) .. (2^(n+1) — 1) ]. например блоки размеров [1], [2..3], [4..7], [8..15], [16..31], [32..63], [64..127], [ 128..256] ... байт.

Этот дизайн обеспечивает быструю и постоянную производительность распределителя времени для всех выделений независимо от размера выделения или емкости кучи.

Вы можете использовать Profiler.GetTotalFragmentationInfo для отслеживания свободных блоков памяти в куче с течением времени.

using Unity.Collections; using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { const int kFreeBlockPow2Buckets = 24; void Update() { var freeStats = new NativeArray(kFreeBlockPow2Buckets, Allocator.Temp); var freeBlocks = Profiler.GetTotalFragmentationInfo(freeStats); Debug.Log(string.Format("Total Free Blocks: {0}", freeBlocks)); for (int i = 0; i < kFreeBlockPow2Buckets; i++) { Debug.Log(string.Format(" size[2^{0}] = {1} blocks", i, freeStats[i])); } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3