yurickon Posted November 5, 2025 Posted November 5, 2025 Привет всем! Уважаемые разработчики, подскажите или направьте в нужном направлении) У меня не получается самому с этим разобраться(.. Проблема в том, что после первой загрузки с сохранения в начале игры, объем оперативной памяти игры увеличивается с 3.5 ГБ до 5 ГБ. Причем я ничего не спавнил, вообще ничего не делал. Просто создал новую игру, сохранился и загрузился. При следующей загрузке еще на полтора гига и так далее.. Сохранения пишу в бинарный файл, все оттуда выкинул, оставил только позицию игрока. Гигабайты так же прибавляются и после выхода в главное меню. Например, в главном меню игра занимала 700 МБ (там отдельный World), после перехода из основного мира, уже 4 ГБ. Понятно, что движок много что кеширует и при перезагрузке мира не удаляет эти данные. Есть ли стандартный способ очистки этих данных, вообще как можно повлиять на то, что бы память так не росла? А то заставлять игрока полностью выходить из игры и заходить снова после каждой загрузки сохранения - такое себе удовольствие)) И еще есть такая ошибка, не знаю связана она или нет с описанной выше проблемой. Очень часто при запуске из VS игра крашится с ошибкой в консоли \Siberian\bin\Siberian_x64.exe (процесс 28352) завершил работу с кодом -1073740791 (0xc0000409). Какие-то проблемы с выделением памяти. Причем вылет не совсем рандомный. Если выждать паузу секунд 12-15 после загрузки главного меню (из-за него не вылетает), то с большой вероятностью можно загрузить основной мир. Но не всегда опять же. Возможно, надо не бинарником сериализовывать данные, а например xml. Может это как-то влиять? Студия же ворчит на бинарник: Вот такие сложности. Буду очень благодарен за любую помощь!
arizmenda Posted November 5, 2025 Posted November 5, 2025 Здравствуйте! Судя по поведению, у вас утечка - какие-то объекты остаются в памяти, и движок их не может освободить. Обычно это происходит, когда где-то остается ссылка на старую ноду или ресурс, или просто забыли удалить за собой "мусор". Поэтому сейчас лучше пройтись по коду загрузки/очистки, добавить временные комментарии/логирование и понять в каком месте отваливается освобождение. Особенно смотрите на все, что создается вручную (loadNode, new, create), и на менеджеры/синглтоны, которые могут держать ссылки на старые сцены. Чтобы полностью освободить память, есть еще метод memoryClear() https://developer.unigine.com/en/docs/2.20/api/library/rendering/class.render#memoryClear_void Он очищает видеопамять и внутренние пулы памяти, удаляет текстуры и меши, но саму утечку он не решает. Если на объекты еще есть ссылки, движок считает их используемыми и не удаляет. Поэтому сначала необходимо найти утечку, а потом использовать memoryClear() для окончательной очистки кэшей и пулов памяти перед загрузкой следующей сцены или больших ресурсов. 1
yurickon Posted November 6, 2025 Author Posted November 6, 2025 @arizmenda Покопался в проблеме, вопрос не простой. С помощью метода memoryClear() не удалось освободиться память.. Ладно, буду дальше копать. Спасибо за советы!
silent Posted November 10, 2025 Posted November 10, 2025 Как вариант еще можно глянуть в профайлере хотя бы из какой области память растёт. В консоли можно включить профайлер памяти: show_profiler 1 && show_profiler_memory 1 1 How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
yurickon Posted November 11, 2025 Author Posted November 11, 2025 @silent спасибо, проверю. Проблему с увеличением памяти после перезагрузки world / выхода в главное меню, я уже решил. Может кому пригодится, немного поясню. Оказалось, если в init спавнить, например WorldTrigger (мой случай), то после перезагрузки мира (не выходя из приложения), данные по этим триггерам буду мусориться, накапливаться. Пришлось спавн сделать динамическим, по мере приближения к объекту и удалять nodereference тут же по мере отдаления. Осталась проблема небольшой утечки, сборщик мусора подбирает, в мониторинге VS желтые флажки CG роятся как пчёлы)) и переполнения вроде не происходит, но есть небольшие "подёргивания" fps, думаю с этим связано.. Да, по максимуму не используйте статические переменные. Они не удаляются, мусорятся и живут пока живет приложение. И еще много чего пришлось делать в коде - отписки от эвентов, обнуление ссылок в shotdown в большинстве компонентов.. Однако есть еще над чем работать. 1
Recommended Posts