Утречка! Давно ничего не писал, были причины. Немножко расскажу, так получилось что 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
Все хорошо работает, но есть одно но, если быстро кликнуть на кнопку, появится ошибка.
Потому что предыдущий запрос не успел выполнится, а уже новый шлём.
А нам вот надо кровь из носу слать сколько угодно запросов, задудосить может хотим кого(Осуждаю), идем в следующий тутор.
https://docs.godotengine.org/en/stable/classes/class_httprequest.html#class-httprequest
Переписываем код, чтобы при нажатии на кнопку спавнился новый реквест и уже он пускай и отрабатывает, подправим немножко код.
Вроде бы все как надо, но теперь появилась другая проблема.
И все как бы логично, мы же создаем новые реквесты, но никуда их не деваем, они свое сделали и висят балластом. Блин не могу найти странное решение, которое видел на форуме, но оно сводилось к удалению всех потомков на сцене. Не суть, напишу сейчас похожее, внимание не повторяйте это. Но для образовательных целей пойдет. Заодно ознакомимся с очень замечательным методом print_stray_nodes()
потыкаем на кнопочку 10 раз пока она не пропадет и посмотрим на результат.
В профайлере появились беспризорные ноды, у которых нет родителей. Подмывает Лилу с футурамы вставить, тренд же, но не буду. Вообщем это самое первое смотрите всегда, если чувствуете что проекту плохеет со временем, ну и теперь глянем что же показывает тот чудесный метод.
а тут список всех потерянных нод с именами, можно даже наколхозить свой сборщик мусора и периодически вызывать это в проекте, чтобы чистить потеряшек, но я этого делать не буду и вам не советую используйте class_name для своих нод, они тут будут нормальные названия иметь, найти утечку уже дело плевое совсем.
Вот такие дела, пользуйтесь на здоровье.
Ну наверное может у тех кто только осваивает ещё все это дело возникнуть вопрос, а как по уму то сделать, чтобы удалялись только неиспользуемые?
Отличное решение будет сделать пул реквестов, чтобы использовать ранее созданные, но уже отработавшие свое, а если в пуле нет свободных то расширять пул созданием новых, это будет оптимально, так вы не тратите процессорное время на создание и удаление объектов, но это к настоящим программистам, мне лень это писать, там писечная выгода будет, для каких-то высоконагруженных систем мб, в любом случае это тема для отдельного поста.
Я покажу пример попроще и он расширит удобство сигналов заодно, мало-ли кто не знает, что так тоже можно)
Вот таким нехитрым образом можно получить доступ к сцене которая вне зоны видимости, может где и пригодится кому, способ простой. Я его использовал для пулек, ну потому что у нас в проекте не используется физика и коллизии, пулька летит в заранее просчитанное место столкновения, все по прямой же движутся)
Всем спасибо за внимание.
P.s. Жена занялась Cutout анимацией, немножко в кодинг тоже начала тыкаться. Так что очень возможно запилю серию новичковую заново с более продуманным планом. Опыта опять же прибавилось, какие-то вещи пересмотрел, в каких-то укоренился напротив, все во благо скорости. Пусть и не топовый программист, но за три дня могу сделать любой прототип и 90% работы, а потом уже месяцами делать оставшиеся 90% работы)