Jump to content

Как освободить память после перезагрузки мира?


photo

Recommended Posts

Posted

Привет всем! Уважаемые разработчики, подскажите или направьте в нужном направлении) У меня не получается самому с этим разобраться(..  Проблема в том, что после первой загрузки с сохранения в начале игры, объем оперативной памяти игры увеличивается с 3.5 ГБ до 5 ГБ. Причем я ничего не спавнил, вообще ничего не делал. Просто создал новую игру, сохранился и загрузился. При следующей загрузке еще на полтора гига и так далее.. Сохранения пишу в бинарный файл, все оттуда выкинул, оставил только позицию игрока. Гигабайты так же прибавляются и после  выхода в главное меню. Например, в главном меню игра занимала 700 МБ (там отдельный World), после перехода из основного мира, уже 4 ГБ. Понятно, что движок много что кеширует и при перезагрузке мира  не удаляет эти данные. Есть ли стандартный способ очистки этих данных, вообще как можно повлиять на то, что бы память так не росла? А то заставлять игрока полностью выходить из игры и заходить снова после каждой загрузки сохранения - такое себе удовольствие)) 

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

\Siberian\bin\Siberian_x64.exe (процесс 28352) завершил работу с кодом -1073740791 (0xc0000409).

Какие-то проблемы с выделением памяти. Причем вылет не совсем рандомный. Если выждать паузу секунд 12-15 после загрузки главного меню (из-за него не вылетает), то с большой вероятностью можно загрузить основной мир. Но не всегда опять же.  Возможно, надо не бинарником сериализовывать данные, а например xml. Может это как-то влиять? Студия же ворчит на бинарник:

image.png.13fb4d20ddb99395bc9422cf432dd15f.png

Вот такие сложности. Буду очень благодарен за любую помощь!

Posted

Здравствуйте!

Судя по поведению, у вас утечка - какие-то объекты остаются в памяти, и движок их не может освободить. Обычно это происходит, когда где-то остается ссылка на старую ноду или ресурс, или просто забыли удалить за собой "мусор". Поэтому сейчас лучше пройтись по коду загрузки/очистки, добавить временные комментарии/логирование и понять в каком месте отваливается освобождение. Особенно смотрите на все, что создается вручную (loadNode, new, create), и на менеджеры/синглтоны, которые могут держать ссылки на старые сцены.

Чтобы полностью освободить память, есть еще метод memoryClear() https://developer.unigine.com/en/docs/2.20/api/library/rendering/class.render#memoryClear_void 

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

  • Thanks 1
Posted

@arizmenda Покопался в проблеме, вопрос не простой. С помощью метода memoryClear() не удалось освободиться память.. Ладно, буду дальше копать.

Спасибо за советы!

Posted

Как вариант еще можно глянуть в профайлере хотя бы из какой области память растёт. В консоли можно включить профайлер памяти:

  • show_profiler 1 && show_profiler_memory 1
  • Thanks 1

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Posted

@silent спасибо, проверю. Проблему с увеличением памяти после перезагрузки world / выхода в главное меню, я уже решил.  Может кому пригодится, немного поясню. Оказалось, если в init спавнить, например WorldTrigger (мой случай), то после перезагрузки мира (не выходя из приложения), данные по этим триггерам буду мусориться, накапливаться. Пришлось спавн сделать динамическим, по мере приближения к объекту и удалять nodereference тут же по мере отдаления. Осталась проблема небольшой утечки, сборщик мусора подбирает, в мониторинге VS желтые флажки CG роятся как пчёлы)) и переполнения вроде не происходит, но есть небольшие "подёргивания" fps, думаю с этим связано.. Да, по максимуму не используйте статические переменные. Они не удаляются, мусорятся и живут пока живет приложение.  И еще много чего пришлось делать в коде - отписки от эвентов, обнуление ссылок в shotdown в большинстве компонентов.. Однако есть еще над чем работать.  

  • Like 1
×
×
  • Create New...