Unity3D: оптимизация сбора мусора

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

По данным инструкция единства, Я попытался добавить это в свой код:

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

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

PS:

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

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

profiler

1 ответов


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

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

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

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

несколько советов:

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