Подтвердить что ты не робот

Unity3D: оптимизировать сбор мусора

Unity3D Profiler дает мне пики, которые в основном связаны с сборкой мусора. На скриншоте ниже три красных пика представляют три киоска, которые у меня были в моем игровом процессе. Каждый из этих киосков составляет 100 + мс, и большую часть времени тратится на TrackDependencies.

Согласно Инструкция Unity, я попытался добавить это в свой код:

if (Time.frameCount % 30 == 0)
{
    System.GC.Collect();
}

Это не помогло. У меня все еще есть шипы, и они все равно принимают 100 + мс. Что именно происходит и что я могу сделать для оптимизации моей игры?

PS:

Я динамически создаю и уничтожаю много GameObject в своей игре. Это может быть проблема?

У меня нет конкатенации строк в цикле или массиве как возвращаемое значение, как показано в сообщение.

profiler

4b9b3361

Ответ 1

Это не помогло. У меня все еще есть шипы, и они все равно принимают 100 + мс. Какие точно идет и что я могу сделать, чтобы оптимизировать свою игру?

С System.GC.Collect вы просто вынуждаете сбор мусора. Если вы выделили много памяти для освобождения от последнего сбора, вы не сможете избежать всплесков. Это полезно только для того, чтобы попытаться распределить сборку мусора с течением времени, избегая массивного освобождения.

Я динамически создаю и уничтожаю много GameObjects в своем игра. Это может быть проблема?

Возможно, это может быть проблемой.

Некоторые подсказки:

  • Постарайтесь выделить (LoadResource и Instantiate) как можно больше ресурсов в начале вашего приложения. Если требуемая память не слишком велика, вы можете просто создать все необходимые ресурсы и отключить их по требованию. Если требования к ресурсной памяти огромны, это невозможно.
  • Избегайте входящих вызовов Instantiate и Destroy. Создайте пул объекта, в котором запускается набор ресурсов при запуске приложения. Включите необходимые ресурсы и отключите все остальное. Вместо того, чтобы уничтожить объект, выпустите его в пул, чтобы его можно было отключить и повторно использовать по требованию.
  • Избегайте входящих вызовов Resources.UnloadUnusedAssets. Это может только увеличить время, необходимое для создания нового ресурса, если вы ранее его выпустили. Полезно использовать opitmize memory, но называть его с интервалами с интервалом или каждый раз, когда вы уничтожаете объект, нет смысла.