Что такое граф сцены в контексте разработки игрового движка?
Что ж, это некоторый код, который активно сортирует ваши игровые объекты в игровом пространстве таким образом, чтобы его было легко быстро найти, какие объекты находятся вокруг точки в игровом пространстве.
Таким образом, легко:
- быстро найти, какие объекты находятся в поле зрения камеры.(и отправлять только их на видеокарты, делая рендеринг очень быстрым)
- быстро находит объекты рядом с игроком (и применяет проверки столкновений только к ним)
И другие вещи,Речь идет о разрешении быстрого поиска в космосе.Это называется "разделение пространства".Речь идет о разделяй и властвуй.
Зачем мне использовать его для моего 2D игрового движка?
Это зависит от типа игры, точнее от структуры.вашего игрового пространства.
Например, в такой игре, как Zelda, такие методы могут не понадобиться, если она достаточно быстра для проверки столкновения между всеми объектами на экране.Однако он может быть очень медленным, поэтому большую часть времени вы, по крайней мере, настраиваете граф сцены (или любой раздел пространства), чтобы хотя бы знать, что происходит вокруг всех движущихся объектов, и тестировать столкновения только на этих объектах.
Итак, это зависит.Большую часть времени это требуется по соображениям производительности.Но реализация вашего пространственного разбиения полностью соответствует тому, как структурировано игровое пространство.
Является ли использование графа сцены альтернативой классической системе сущностей с линейным менеджером сущностей?
Нет.
Каким бы образом вы ни управляли жизнью объектов ваших игровых сущностей, граф-раздел-пространство / сцена существует только для того, чтобы вы могли быстро искать объекты в пространстве, нетбольше не меньше.В большинстве случаев это будет объект, который будет иметь несколько слотов объектов, соответствующих различным частям игрового пространства, и в этих слотах это будут объекты, которые находятся в этих частях.Он может быть плоским (как 2D экранный делитель на 2 или 4), или это может быть дерево (например, двоичное дерево или дерево квадрантов, или любой другой вид дерева) или любая другая структура сортировки, которая ограничивает количество операций, которые вы должнывыполнить для получения некоторой связанной с пространством информации.
Обратите внимание на одну вещь:
В некоторых случаях вам даже нужны разные отдельные системы разделов пространства для разных целей.Часто «граф сцены» - это рендеринг, поэтому он оптимизирован таким образом, что зависит от точки зрения игрока, и его цель - обеспечить быстрый сбор списка объектов для рендеринга для отправки на видеокарту.На самом деле он не подходит для поиска объектов вокруг другого объекта, и его трудно использовать для точного обнаружения столкновений, например, при использовании физического движка.Таким образом, чтобы помочь, у вас может быть другая система космических перегородок только для физических целей.
В качестве примера, я хочу сделать игру "Bullet Hell", где много космических кораблей игрокадолжен увернуться очень точным способом.Для достижения достаточной производительности рендеринга и обнаружения столкновений мне нужно знать:
- когда пули появляются на экране
- когда пули покидают пространство экрана
- когда игроквступает в столкновение с пулями
- , когда игрок вступает в столкновение с монстрами
Поэтому я рекурсивно разрезаю экран, который является 2D на 4 части, что дает мне квадродерево.Дерево квадрантов обновляется каждый тик игры, потому что все движется постоянно, поэтому я должен отслеживать положение каждого объекта (космический корабль, пуля, монстр) в дереве квадрантов, чтобы узнать, какой из них находится в какой части экрана.
Достижение 1. легко, просто введите пулю в систему.
Для достижения 2. Я сохранил список листьев в квадродереве (квадратные участки экрана), которые находятся на границе экрана. Эти листья содержат идентификаторы / указатели пуль, которые находятся рядом с границей, поэтому я просто должен проверить, что они движутся, чтобы узнать, смогу ли я прекратить их рендеринг и управлять столкновениями тоже. (Это может быть немного сложнее, но вы поняли идею.)
Для достижения 3 и 4. Мне нужно получить объекты, которые находятся возле космического корабля игрока. Итак, сначала я получаю лист, где находится космический корабль игрока, и я получаю все объекты в нем. Таким образом, я проверю столкновение с космическим кораблем игрока только на объектах, которые находятся вокруг него, а не на всех объектах. (Это немного сложнее, но вы поняли.)
Таким образом, я могу убедиться, что моя игра будет работать гладко, даже если тысячи пуль постоянно движутся.
В других типах пространственной структуры требуются другие типы разделения пространства. Как правило, в играх kart / auto есть «туннельный» сюжетный график, потому что визуально игрок будет видеть только вещи вдоль дороги, поэтому вам просто нужно проверить, где он находится на дороге, чтобы найти все видимые объекты вокруг в «туннеле». .