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