Игровые движки: что такое графы сцен? - PullRequest
31 голосов
/ 16 марта 2011

Я начал читать материал в Википедии, но все еще чувствую, что не совсем понимаю, как работает граф сцены и как он может дать преимущества для игры.

  • Что такое граф сцены в контексте разработки игрового движка?
  • Почему я хотел бы реализовать один для моего 2D игрового движка?
  • Является ли использование графа сцены альтернативой классической системе сущностей с линейным менеджером сущностей?

Ответы [ 5 ]

25 голосов
/ 16 марта 2011

Что такое граф сцены в контексте разработки игрового движка?

Что ж, это некоторый код, который активно сортирует ваши игровые объекты в игровом пространстве таким образом, чтобы его было легко быстро найти, какие объекты находятся вокруг точки в игровом пространстве.

Таким образом, легко:

  1. быстро найти, какие объекты находятся в поле зрения камеры.(и отправлять только их на видеокарты, делая рендеринг очень быстрым)
  2. быстро находит объекты рядом с игроком (и применяет проверки столкновений только к ним)

И другие вещи,Речь идет о разрешении быстрого поиска в космосе.Это называется "разделение пространства".Речь идет о разделяй и властвуй.

Зачем мне использовать его для моего 2D игрового движка?

Это зависит от типа игры, точнее от структуры.вашего игрового пространства.

Например, в такой игре, как Zelda, такие методы могут не понадобиться, если она достаточно быстра для проверки столкновения между всеми объектами на экране.Однако он может быть очень медленным, поэтому большую часть времени вы, по крайней мере, настраиваете граф сцены (или любой раздел пространства), чтобы хотя бы знать, что происходит вокруг всех движущихся объектов, и тестировать столкновения только на этих объектах.

Итак, это зависит.Большую часть времени это требуется по соображениям производительности.Но реализация вашего пространственного разбиения полностью соответствует тому, как структурировано игровое пространство.

Является ли использование графа сцены альтернативой классической системе сущностей с линейным менеджером сущностей?

Нет.

Каким бы образом вы ни управляли жизнью объектов ваших игровых сущностей, граф-раздел-пространство / сцена существует только для того, чтобы вы могли быстро искать объекты в пространстве, нетбольше не меньше.В большинстве случаев это будет объект, который будет иметь несколько слотов объектов, соответствующих различным частям игрового пространства, и в этих слотах это будут объекты, которые находятся в этих частях.Он может быть плоским (как 2D экранный делитель на 2 или 4), или это может быть дерево (например, двоичное дерево или дерево квадрантов, или любой другой вид дерева) или любая другая структура сортировки, которая ограничивает количество операций, которые вы должнывыполнить для получения некоторой связанной с пространством информации.

Обратите внимание на одну вещь:

В некоторых случаях вам даже нужны разные отдельные системы разделов пространства для разных целей.Часто «граф сцены» - это рендеринг, поэтому он оптимизирован таким образом, что зависит от точки зрения игрока, и его цель - обеспечить быстрый сбор списка объектов для рендеринга для отправки на видеокарту.На самом деле он не подходит для поиска объектов вокруг другого объекта, и его трудно использовать для точного обнаружения столкновений, например, при использовании физического движка.Таким образом, чтобы помочь, у вас может быть другая система космических перегородок только для физических целей.

В качестве примера, я хочу сделать игру "Bullet Hell", где много космических кораблей игрокадолжен увернуться очень точным способом.Для достижения достаточной производительности рендеринга и обнаружения столкновений мне нужно знать:

  1. когда пули появляются на экране
  2. когда пули покидают пространство экрана
  3. когда игроквступает в столкновение с пулями
  4. , когда игрок вступает в столкновение с монстрами

Поэтому я рекурсивно разрезаю экран, который является 2D на 4 части, что дает мне квадродерево.Дерево квадрантов обновляется каждый тик игры, потому что все движется постоянно, поэтому я должен отслеживать положение каждого объекта (космический корабль, пуля, монстр) в дереве квадрантов, чтобы узнать, какой из них находится в какой части экрана.

Достижение 1. легко, просто введите пулю в систему.

Для достижения 2. Я сохранил список листьев в квадродереве (квадратные участки экрана), которые находятся на границе экрана. Эти листья содержат идентификаторы / указатели пуль, которые находятся рядом с границей, поэтому я просто должен проверить, что они движутся, чтобы узнать, смогу ли я прекратить их рендеринг и управлять столкновениями тоже. (Это может быть немного сложнее, но вы поняли идею.)

Для достижения 3 и 4. Мне нужно получить объекты, которые находятся возле космического корабля игрока. Итак, сначала я получаю лист, где находится космический корабль игрока, и я получаю все объекты в нем. Таким образом, я проверю столкновение с космическим кораблем игрока только на объектах, которые находятся вокруг него, а не на всех объектах. (Это немного сложнее, но вы поняли.)

Таким образом, я могу убедиться, что моя игра будет работать гладко, даже если тысячи пуль постоянно движутся.

В других типах пространственной структуры требуются другие типы разделения пространства. Как правило, в играх kart / auto есть «туннельный» сюжетный график, потому что визуально игрок будет видеть только вещи вдоль дороги, поэтому вам просто нужно проверить, где он находится на дороге, чтобы найти все видимые объекты вокруг в «туннеле». .

16 голосов
/ 16 марта 2011

Что такое граф сцены? A Граф сцены содержит всю геометрию конкретной сцены. Они полезны для представления перемещений, вращений и масштабов (наряду с другими аффинными преобразованиями ) объектов относительно друг друга.

Например, рассмотрим танк (типа с гусеницами и пистолетом). Ваша сцена может иметь несколько танков, но каждый из них должен быть ориентирован и позиционирован по-разному, при этом каждая башня поворачивается на разные азимуты и с разным углом наклона оружия. Вместо того, чтобы точно определить, как оружие должно быть расположено для каждого танка, вы можете накапливать аффинные преобразования при прохождении графика сцены, чтобы правильно позиционировать его. Это делает вычисление таких вещей намного проще.

Графики 2D-сцен: Использование графа сцены для 2D может быть полезно, если ваш контент достаточно сложный и если у ваших объектов есть несколько подкомпонентов, не жестко привязанных к большому телу. В противном случае, как уже упоминали другие, это, вероятно, излишним. Сложность аффинных преобразований в 2D немного меньше, чем в случае 3D.

Менеджер линейных сущностей: Я не совсем точно понимаю, что вы имеете в виду под менеджером линейных сущностей , но если вы просто отслеживаете положение вещей в ваша сцена, тогда графы сцены могут упростить ситуацию, если существует высокая степень пространственной зависимости между различными объектами или подобъектами в вашей сцене.

3 голосов
/ 09 сентября 2013

Похоже, в Интернете довольно много разных философий относительно того, как реагируют на сценограф. Люди, как правило, вводят много разных вещей, таких как геометрия, камеры, источники света, игровые триггеры и т. Д.

В общем, я бы описал сценограф как описание сцены и состоит из одной или нескольких структур данных, содержащих сущности, присутствующие в сцене. Эти структуры данных могут быть любого типа (массив, дерево, составной шаблон и т. Д.) И могут описывать любое свойство объектов или любые отношения между объектами в сцене. Этими объектами могут быть что угодно, начиная от сплошных прорисовываемых объектов до сеток столкновений, камер и источников света. Единственное реальное ограничение, которое я видел до сих пор, - это то, что люди рекомендуют не включать специфические для игры компоненты (например, игровые триггеры), чтобы впоследствии избежать проблем с зависимостями. Такие вещи должны быть абстрагированы, скажем, от «LogicEntity», «InvisibleEntity» или просто «Entity».

Вот некоторые общие примеры использования структур данных в графе сцены.

Отношения между родителями и детьми

Способ использования графа сцены в игре или движке заключается в описании отношений между родителями и детьми между всем, что имеет позицию, будь то твердый объект, камера или что-то еще. Такое отношение будет означать, что положение, масштаб и ориентация любого ребенка будут относительно положения его родителя. Это позволит вам заставить камеру следовать за игроком или иметь источник света, следящий за объектом фонарика. Это также позволило бы вам создавать такие вещи, как солнечная система, в которой вы можете описать положение планет относительно Солнца и положение лун относительно их планеты, если это то, что вы делаете.

Также в графе сцены могут храниться данные, относящиеся к какой-либо системе в вашей игре / движке. Например, как часть физического движка вы можете определить простые сетки столкновений для твердых объектов, которые могут иметь слишком сложную геометрию, чтобы проверять столкновения. Вы можете поместить эти сетки столкновений (я уверен, что у них есть другое имя, но я забыл их: P) в вашей сцене, и пусть они следуют за объектами, которые они моделируют.

Space-разбиение

Другой возможной структурой данных в графе сцены является некоторая форма разбиения пространства , как указано в других ответах. Это позволит вам выполнять быстрые запросы на сцене, например, обрезать любой объект, который не входит в область просмотра, или эффективно отфильтровывать объекты, которые требуют проверки на столкновение. Вы также можете разрешить клиентскому коду (если вы пишете движок) выполнять пользовательские запросы для любых целей. Таким образом, клиентский код не должен поддерживать свои собственные структуры разделения пространства.

Я надеюсь, что дал вам и другим читателям некоторые идеи о том, как вы можете использовать сценограф и что вы можете в него вставить. Я уверен, что есть много других способов использовать сценограф, но это то, что я придумал.

3 голосов
/ 16 марта 2011

Граф сцены - это способ организации всех объектов в среде.Обычно стараются организовать данные для эффективного рендеринга.График или дерево, если хотите, может показать владение подобъектами.Например, на самом высоком уровне может быть городской объект, под ним будет много строительных объектов, под ними могут быть стены, мебель ...

По большей части, они используются только для 3Dсцены.Я бы предложил не идти с чем-то сложным для 2D-сцены.

2 голосов
/ 16 марта 2011

На практике объекты сцены в видеоиграх редко организуются в граф, который "отображается" в виде дерева при визуализации сцены. Графическая система обычно ожидает рендеринга одного большого массива, и этот большой массив проходит линейно.

Игры, для которых требуются геометрические родительские отношения, например, с людьми с оружием или танками с турелями, определяют и применяют эти отношения по мере необходимости вне графической системы. Эти отношения, как правило, имеют только одну глубину, и поэтому почти никогда не требуется произвольно глубокая древовидная структура.

...