Unity 6.3
0 онлайн 74 гостей 3 в системе
Вход

Profiler.GetTotalFragmentationInfo

Declaration

public static long GetTotalFragmentationInfo(NativeArray<int> stats);

Параметры

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

Возвращаемое значение

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

Описание

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

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

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

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

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

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

Как Unity динамически выделяет и высвобождает память, он управляет областью кучи, отслеживая свободные блоки памяти. Внутренне Unity группирует эти свободные блоки памяти в списки одинаковых размеров — сгруппированные в степень двух размеров, между одной степенью двух и следующей, в частности [ (2^n).. (2^(n+1) — 1) ].

e.g. блоки размеров [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<int>(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])); } } }