Главная » Статьи » Общее

Размышления о архитектуре "движка"
В данной статье я поделюсь своими мыслями по поводу того, какой должна быть архитектураа игрового движка. Многим, скорее всего, мои мысли покажутся не верными и может даже бредовыми, но в то же время комуто может и понравится мой подход к этому вопросу. А если кто-то захочет поделиться своими мыслями, то пишите мне на мыло (mailto:vile_dog@rambler.ru )

ИтаГ! В интенете есть довольно много материала по данному вопросу, но все что там описано, - это хождение вокруг да около, различные графики и схемки изображающие архитектуру движков, и различные подходы к ее реализации. Это все конечно хОрошо, вот только о том как это все внутри устроено, ни слова! sad Когда я сказал внутри, я имел ввиду расположение папок, файлов, и д.р. вплоть до описания функций и их взаимодействия между собой.
К сожалению такой информации я не нашел, и даже в спец. литературе, зачастую, архитектура движка рассматривается поверхностно, что порой ставит больше вопросов нежели дает ответов. 
Но это совершенно не значит, что подробной информации неД вообще. Она есть в огромном количестве на просторах ЫнтЫрнета, хотя зачастую не совсем удобочитаема, - ЭТО САМИ ДВИЖКИ! smile Бесплатных движков сейчас просто валом, бери да ковыряйся... Это пожалуй лучший способ узнать о том, как устроены игровые движки, но дело в том, что этот метод является самым сложным для понимания, поскольку каждый програмист обладает собственным стилем, применяет какие-то свои приемы, и разобраться в чужом коде порой бывает оооооочень сложно.

Так вот! Давайте все-таки поразмыслим над тем, ЧТО ЕСТЬ ИГРОВОЙ ДВИЖОГ? Я неоднократно встречал на форумах споры по данному вопросу, порой доходившие до хУливароФФ...
С моей точки зрения игровой движок, это некая програмная конструкция состоящая из различных блоков. Эту конструкцию можно представить как игрушку собранную из кубикофф ЛЕГО, где каждый кубик, это некая функция, а каждая более крупная деталь, это набор взаимосвязанных функций которые отвечают за ту или иную функциональность всего движка (звук, физика, и др...).

Давайте выделим основные части из которых состоит игровой движок:
1. Рендерер (англ. Renderer - прорисовщик smile часто называемый Графический Движок) - эта часть отвечает за выведение(отрисовку) всего, что мы видим на экране (персонажи, уровни, кнопочки, букофки, и все остальное). На данном этапе развития компьютерных игр, эта часть движкоФФ является наиболее динамически развиваемой и именно на графику, сейчас, делается основной упор, порой пренебрегая другими качествами игры (геймПлей, сюжет и т.д.)
2. Звук (он же Звуковой Движок(Sound Engine)) - здесь, я думаю, все понятно. Это та часть игрового движка, которая отвечает за воспроизведение звука в игре (звуковые эффекты, музыкальное сопровождение, речь персонажей...). Звуковые движки бывают разные, соответственно у них различная функциональность, такая как: поддержка различных звуковых форматов, наличие\отсутствие поддержки 5-ти, 6-ти, 7-ми, N канального звука, различных фишек типа EAX и др. Эта часть игрового движка является ОООчень важной, и порой от качество звукового сопровождения играет решающую роль в успехе игры.
3. Физика (он же Физический Движок(Physics Engine)) - это все, что связано с симуляцией физического поведения объектов в виртуальном мире. Физ. движок отвечает за такие вещи как гравитация, проверка столкновений виртуальной камеры с объектами, геометрией уровня, одних объектов с другими и определяет их поведение пр воздействии на них всевозможных физических сил. В данный момент физическая симуляция в играх набирает обороты. С увеличением мощьности процессоров, выпуском Физических ускорителей и бурном развитии GPGPU(ускорение физ.расчетов с использованием Графического Процессора) физические эффекты перешли на новый уровень. Поведение объектов стало на много реалестичнее! всякого рода РагДолы просто радуют глаз :). Колизии просчитываются максимально точно, и всего со всем...
Также следует выделить Систему Частиц(Particle System), которую я бы отнес скорее к физ. движку, хотя Она также активно юзает Рендерер. Эта система отвечает за моделирование эффектов на основе частиц. К ним относятся такие эффекты как снег, дождь, огонь, дым, искры и прочие эффекты, которые моделируются при помощи множества частиц, в качестве которых зачастую используются билБорды(ориентированные на камену полигоны) или спрайты(которые по сути являются теми же билБордами, токо с аппаратной поддержкой).
4. Ввод (оно же Система Ввода(InputSystem)) - эта часть отвечает за обработку устройств ввода (клавы, мыши, джойстики, рули, геймпады, и др.). Не будь этой системы - играть было бы не интересно :)) Системы ввода различается по своим возможностям, типа поддержка различных устройств, аппаратного скорения(аля DirectInput)и др.
5. GUI (он же ГУИ, он же Графический Интерфейс) - это графический, так скать, пользовательский интерфейс, т.е окошки, кнопочки, ползунки, бегунки и прочее, причем не только в менюшке где мы обычно проводим разлмчные настройки игры, выбор уровня, загрузку сохранение, но и непосредственно в процессе игры. Вспомните ДуМ3 и консоли(например те которые открывали двери и шкафчики) - это тоже ГУИ. Эту часть движка можно отнести к Рендереру, но многие выделяют его в отдельную часть, которая использует рендерер для отрисовки. Хотя лучше если это будет отдельным компонентом, поскольку ГУИ также использует Систему Ввода, и какимто боком Физ. Движок...
6. Скриптовый движок (он же Скриптовый движок :)) Я надеюсь что вы хотябы краем глаза слышали о скриптах и о DataDrivenEngine. Если нет, то попытаюсь обЪяснить, насколько сам понимаю.
Итак, скрипты это то, что помогает нам сделать с нашего движка DataDrivenEngine (движок управляемый данными). Таким образом наш движок становится наиболее гибким. Например: нам нужно, чтобы наш персонаж окзавшись возле двери подошел к рядом стоящему рычажку и дернул его, - для этого мы загружаем файлик со скриптом (написанном на высокоуровневом языке) в котором прописаны все действия нашего персонажа и остальных обЪектов (Entyti) в сцене. Таким образом мы избавляемся 
от львной доли хардкодинга, и лишней перекомпиляции, что соответственно намного упрощает и ускоряет процесс создания нашей МЕГАГАМЫ!!! 
Как пример очень популярного скриптового языка могу посоветовать LUA (http://www.lua.org)

Итак мы имеем 6 составляющих игрового движка (надеюсь ничего важного не пропустил) которые нам нужно собрать воедино так, чтоб это все заработало.
В идеале я стремлюсь к тому, чтобы создание какой нибудь гамы\демки сводилось к созданию пустого проекта в котором присутствовали бы 2 файлика main.cpp, main.h 
(ну и еще может пару каких-нибуть вспомогательных) в которых мы делаем #include "MEGAengine.h", создаем функцию WinMain в которой прописываем пути к
файлам конфигурации, инициализируем движок или нужные его части и ВУАЛЯ - гузятся скрипты, меню, в котором пользователь тычет в кнопки, и соответсвенно
загружаются необходимые левелы, все блестит и крутиццо - ЗАШИБИСЬ! :)


2 BE CONTINUED...

Виталий Демиденко © 2007

Категория: Общее | Добавил: viledogsoftware (12.06.2007) | Автор: VileDog
Просмотров: 4418 | Комментарии: 10 | Рейтинг: 2.7/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]