2017-02-23 64 views
0

Извините, что разместите это здесь, но я в отчаянии.Unity - память не уменьшается после смены сцен

У нас, похоже, есть куча памяти, которая не освобождается при загрузке новых сцен. Текущий процесс загрузки начинается с 1 уровня, используйте одноэкранный экран загрузки для загрузки в пустую сцену, затем вызывается System.GC.Collect(); и Resources.UnloadUnusedAssets(); (на всякий случай), затем загрузите следующий уровень. Но уровни только когда-либо увеличивают размер памяти, даже при перезагрузке существующей сцены, память только увеличивается.

Вот краткий обзор того, что происходит:

  • Загрузка в HUB зона начинается примерно 590,000K (по использованию памяти Task Manager). Это, кажется, в порядке, как это 3D прогулка по площади
  • после перехода на пустую сцену (через выше) до сих пор имеет программу на 405,000K
  • после запуска первой фактической памяти уровня находится в 840,000K
  • после загрузки обратно в пустую сцену снова память на 750,000K
  • после запуска на новый уровень (уровень 2) она переходит к 1,195,000K
  • после загрузки обратно в пустую сцену, как описано выше память на 1,010,000K
  • затем, возвращаясь к миру HUB в stat (через переход нагрузки выше), память находится в 1, 227,000K

Я не думаю, что это утечка единства активов, потому что я гот через проясняться процедурными меши/материалы и в пустом экране загрузки, я посмотрел, что существовало UnityObjects, и это было только это (после вышеописанного процесса):

Loading Scene Results

снимок памяти на данный момент выглядит следующим образом:

Memory Snapshot

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

Одна вещь, которую мы обнаружили, загружается на уровень босса, а затем возвращается в область HUB, фактически уменьшает объем памяти, как и следовало (было около 800 МБ после перехода из области Boss -> HUB). Но я не уверен, почему это вызвало освобождение памяти.

В настоящее время на Unity 5.5.0f3

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

Благодаря

+0

Дисплей памяти диспетчера задач может немного вводить в заблуждение. Как и любое приложение с исполняемой средой с управляемой памятью, Unity может иметь «освобожденную» внутреннюю память, но пока не возвращает ее обратно в ОС. Вы можете получить более согласованные результаты, используя профилировщик памяти, который знает об этом, например [профилировщик, встроенный в Unity] (https://docs.unity3d.com/Manual/ProfilerMemory.html). – rutter

ответ

0

Вы должны профилировать приложения с помощью профилировщика, который поставляется с Unity. Основываясь на этом, вы должны быть в состоянии выяснить, что обнимает память.

Если вы используете атласы, вам необходимо убедиться, что вы используете их на полную мощность: только с помощью спрайта или 2 (например, для пользовательского интерфейса) будет загружен весь атлас. В таких случаях лучше разбить атласы на более мелкие.

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

Еще один момент заключается в том, что Unity не освобождает память, как только вы меняете сцены.

+0

Снимок снимка/ссылка на карту памяти показывает, что это главным образом: объекты, ManagedHeap.ReservedUnusedSize, ManagedHeap.Used Размер . Но они очень общие, есть ли способ получить более подробную информацию о единстве? Когда нет единства нормально свободной памяти? Есть ли способ заставить его? – ShockDismantler