2012-04-04 2 views
0

Мы с коллегой рассказываем о том, как сцены обычно отображаются в сложных играх. Он считает, что мир визуализируется рекурсивно в самом прямом объектно-ориентированном стиле, причем многие актеры мира переопределяют виртуальную функцию, например, Actor.Draw() (например, Koopa.Draw(), Goomba.Draw()).Графы сцены: рекурсия или итерация?

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

Является ли один метод предпочтительным для другого в настоящее время? Если да, то почему?

ответ

1

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

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

В конечном итоге метод «одобрения» будет специфичным для проекта.

Смежные вопросы