Godot. Ищем потерянные ноды

Утречка! Давно ничего не писал, были причины. Немножко расскажу, так получилось что 31го декабря, за несколько часов до НГ мы взяли и релизнулись. Не скажу что это эпохальное событие, игра и сейчас сырая, но в целом даже на довольно нишевой платформе более 2000 юзеров, какой-никакой ретеншн и длина сессии очень больше 15 минут, что очень даже неплохо. Это небольшой айдл, приложу маленький видосик с процессом.

Не буду тут рассказывать что это несет великую ценность для геймдева, но для меня как Godot-разработчика большая веха. Полностью кроссплатформа, один билд собирается и в apk и html5, который более менее ровно работает и на пк и с мобилки, наподключали всего чего только можно и appsflyer с devtodev и платежку и рекламу, в качестве бекенда используем Nakama, офигенная вещь и с Godot работает прекрасно, даже есть свой самописный сервер на Godot, мы его используем теперь для сбора своей статистики на этапе загрузки html через вебсокет. Брат у меня из геймдизайнера прям матерым линкусоидом стал, докеры там какие-то разворачивает на VPS, и интерфейсы ваяет, я больше все же клиентской логикой занимаюсь.

Короче это я к чему, Godot офигенно работает во всем, но кривые ручки разработчика могут все подпортить. Самое всеми любимое это конечно же - Утечки памяти, они же Memory Leak.

Как я напортачил сильно не буду углубляться, там очень много кода придется демонстрировать, но это из-за разлетающихся конечностей получилось, эффект прикольный и сделал его быстро, буквально за вечер, но потом долго искал и правил)

Из-за чего может получиться, самое простое и частое, это remove_child вы вызвали, а queue_free() для ноды не вызвали, вот и болтается она в памяти неприкаянная, в языках со сборщиком мусора типа Java, AS3 и тп, они бы почистились в определенный проход, но в Godot нету сборщика мусора, так что лучше не расслабляться. Покажу на немножко утрированном примере, но он практически идентичен тому, как сам натолкнулся на эту проблему и уже начал проверять.

Маленькая ремарка - знакомый играл сказал что на третьем часу игры у него начали подтормаживания, я потом затестил там больше 300000 объектов в памяти накапливалось, что конечно плюс Godot, но минус моим кривым рукам.

Ну ладно меньше текста, немножко покодим, для примера возьму ещё одну полезную в хозяйстве вещь такую как HTTPRequest. Начну прям с этого туториала.
https://docs.godotengine.org/en/stable/tutorials/networking/http_request_class.html#preparing-scene

Сцена

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Скрипт

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Все хорошо работает, но есть одно но, если быстро кликнуть на кнопку, появится ошибка.
Потому что предыдущий запрос не успел выполнится, а уже новый шлём.

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

А нам вот надо кровь из носу слать сколько угодно запросов, задудосить может хотим кого(Осуждаю), идем в следующий тутор.
https://docs.godotengine.org/en/stable/classes/class_httprequest.html#class-httprequest

Переписываем код, чтобы при нажатии на кнопку спавнился новый реквест и уже он пускай и отрабатывает, подправим немножко код.

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Вроде бы все как надо, но теперь появилась другая проблема.

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

И все как бы логично, мы же создаем новые реквесты, но никуда их не деваем, они свое сделали и висят балластом. Блин не могу найти странное решение, которое видел на форуме, но оно сводилось к удалению всех потомков на сцене. Не суть, напишу сейчас похожее, внимание не повторяйте это. Но для образовательных целей пойдет. Заодно ознакомимся с очень замечательным методом print_stray_nodes()

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

потыкаем на кнопочку 10 раз пока она не пропадет и посмотрим на результат.

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

В профайлере появились беспризорные ноды, у которых нет родителей. Подмывает Лилу с футурамы вставить, тренд же, но не буду. Вообщем это самое первое смотрите всегда, если чувствуете что проекту плохеет со временем, ну и теперь глянем что же показывает тот чудесный метод.
а тут список всех потерянных нод с именами, можно даже наколхозить свой сборщик мусора и периодически вызывать это в проекте, чтобы чистить потеряшек, но я этого делать не буду и вам не советую используйте class_name для своих нод, они тут будут нормальные названия иметь, найти утечку уже дело плевое совсем.

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Вот такие дела, пользуйтесь на здоровье.

Ну наверное может у тех кто только осваивает ещё все это дело возникнуть вопрос, а как по уму то сделать, чтобы удалялись только неиспользуемые?

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

Я покажу пример попроще и он расширит удобство сигналов заодно, мало-ли кто не знает, что так тоже можно)

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Ну и скрин профайлера

Godot. Ищем потерянные ноды Godot, Godot Engine, Gamedev, Инди, Видео, Вертикальное видео, Длиннопост

Вот таким нехитрым образом можно получить доступ к сцене которая вне зоны видимости, может где и пригодится кому, способ простой. Я его использовал для пулек, ну потому что у нас в проекте не используется физика и коллизии, пулька летит в заранее просчитанное место столкновения, все по прямой же движутся)

Всем спасибо за внимание.

P.s. Жена занялась Cutout анимацией, немножко в кодинг тоже начала тыкаться. Так что очень возможно запилю серию новичковую заново с более продуманным планом. Опыта опять же прибавилось, какие-то вещи пересмотрел, в каких-то укоренился напротив, все во благо скорости. Пусть и не топовый программист, но за три дня могу сделать любой прототип и 90% работы, а потом уже месяцами делать оставшиеся 90% работы)

Свидетели Godot'овы

84 поста278 подписчиков

Добавить пост

Правила сообщества

Нельзя писать плохой про Godot и можно писать хороший про Godot. Borat.jpg
Упоминание других движков допустимо только в технических сравнениях иначе - вы юнитист и бог вам судья.