Оказалось, что есть свои тонкости, которые стоит учитывать:
- очистка ненужных объектов - если вы создаете любые вспомогательные объекты, то не забывайте их удалять после того, как они сделали свое дело (вызывать queue_free() для нод и просто присваивать null для обычных типов данных);
- минимизация используемых нод - изначально тот же объект врага у меня содержал всевозможные дочерние ноды для всех случаев разных эффектов, что вызывало серьезные лаги при большом количестве врагов, так что теперь я подгружаю только минимальное количество нод для конкретных условий на уровне;
- вдогонку к предыдущему пункту - удаляйте "нужные" ноды сразу как только они закончили свою работу. Например, при установке башен у меня есть небольшая анимация, и теперь я сразу удаляю все с ней связанное как только она заканчивается (экономия в 3 ноды на каждый случай);
- предзагрузка шейдеров - когда в игре впервые появляется любой шейдер, может наблюдаться заметный лаг (при последующих запусках игры шейдеры обычно уже закешированы работают как надо). Чтобы его минимизировать, стоит загрузить все возможные шейдеры как можно раньше, в идеале во время первоначальной загрузки игры во время вступительного экрана. Для этого достаточно разместить все объекты с шейдерами на отдельном CanvasLayer на самом нижнем уровне (обычно достаточно -1 уровня), таким образом слой будет находиться под контентом игры, и при этом все еще просчитываться видеокартой. Не забывайте удалить его после полной загрузки игры;
- аккуратнее со светом - Light2D работает медленно в текущей версии Godot (это обещают починить в 4 версии, но когда это еще случится), поэтому старайтесь ограничиваться малым количеством источников света. К примеру, у меня было всего 4 статичных источника на сцене, и они успешно просаживали фпс на 50%.
Игра интересная, а вот трейлер не цепляет, я хочу смотреть как башенки делают пиу пиу, а не читать текст на чёрном фоне
Башенки не сильно зрелищно это делают, так что пляшем от того, что имеем.
Зато текст такой "вжух"