Камера. Стоит отрегулировать дальность отрисовки так, чтобы в видимость не попадало слишком большое пространство. В Godot 3 и 4 камера из коробки умеет в алгоритм frustrum culling, который отсекает из отрисовки то, чего камера не видит. Важно понимать, что камера нарисует ВСЁ, что попало в область её видимости, даже если один объект заслонён другими, или его размеры ужасно малы - камера его видит. Другой важный момент - если хотя бы мизерная часть объекта попадает на камеру, он весь целиком будет отрисован, для того чтобы показать камере лишь свой пиксель. Что из этого следует? Слишком большие объекты нужно разбивать на части, чтобы на камеру чаще отрисовывался лишь фрагмент/фрагменты объекта, а не весь он целиком. Что обычно может быть таким большим объектом? Да тот же самый terrain, которого в Godot по умолчанию нет (а большинству игр оно и не нужно), но он подключается плагинами. Если же делать terrain самостоятельно, то как минимум следует разбить его на части. В иных движках terrain также побит на фрагменты-чанки хотя это может быть неочевидно, плюс ему добавлен алгоритм генерации на основе редактируемой карты высот, и могут быть написаны какие-то дополнительные оптимизации или поддержка всяких фич, вроде динамической "разрушаемости" и всякого подобного. В некоторых проектах можно применить окклюдеры, имеющиеся в движке - это некие области, через которые взгляд камеры не проникает.
Комментарий недоступен
Эх, а где самое главное, что в годоте не нужно стесняться наследоваться напрямую от Object и RefCounted? Особенно второе, крутая штука. Не всегда нужен функционал Resource в плане отображения в инспекторе, или сериализации данных, но нужно экономить память на инстансинге объектов - это то, что надо.
А на Object весь годот построен.
Ну и второе самое главное, что выкиньте стандартную физику, и поставьте плагин godot-jolt.
Познавательно, вот к вопросу о циклах. Допустим есть простые крестики нолики. Нам нужно проверить по сути два условия победа и ничья. Если ничью, на мой взгляд, проще проверить по кол-ву ходов, мол если ходов 9, а условий победы нет, то ничья. То вот проверка условий победы может быть совершенно разной.
Вариант 1: просто проверяем 8 комбинаций через if...ilif...else
Вариант 2: делаем матрицу и проверяем в каждую сторону от клетки последнего хода, Кол-во совпадающих элементов.
Какой вариант наиболее предпочтителен с точки зрения оптимизации? Если не брать во внимание простоту и лёгкость игры.
Вариант 2 конечно же лучше, чем 1. Если захочется увеличить поле на несколько клеток, то не универсальный алгоритм из варианта 1 уже не будет работать и его придётся переделывать. Да и читаться он будет лучше, чем куча if.
В вашем случае особо без разницы - как вы напишете условие, главное, чтобы оно точно определяло исход, не оставляя дыр.
Логику и внутри цикла то не всегда имеет смысл слишком оптимизировать, а уж вне цикла - одну проверку - ещё меньше поводов.
Минимизировать тяжелые вычисления в циклахНапример, мы хотим закончить уровень, когда все враги умерли
Я пока только осваиваю годо(т), но появилась мысль: а нельзя ли обойтись без цикла, без проверки в каждом тике? Например через сигналы.
Подписались на child_entered_tree (когда заспавнили моба и он на сцене) и child_exiting_tree (убили моба и удалили со сцены). Обнулили счётчик мобов на сцене, вышли на геймовер.
Ссылки на объекты через $ кажется вообще не очень хорошая штука.
При спавне объекта у тебя конечно возникает ссылка на него, и ты можешь в этот момент его на что-то подписать. Или пробросить какие-то сигналы от фиксированных элементов руками, в редакторе.
Тем не менее, заводить ссылки на разные объекты через $ так или иначе приходится, так как вряд ли человек используя визуальный редактор хочет спавнить вобще всё вслепую, как в "доредакторную" эпоху игроделания. Поэтому большая часть элементов будет уже расставлена в сцене заранее и какому-либо скрипту сцены понадобятся ссылки на эти элементы, чтобы двигать их, включать/выключать, показывать /скрывать, передать кому-то ещё и так далее.