Разработка компьютерных игр. Intro

Зрителям всегда интересно, когда помимо полюбившегося фильма показывают сам процесс его съемки, специалисты демонстрируют применяемые технологии, актеры рассказывают о разнообразных трудностях. Это уже тенденция — например, на фирменных DVD вы всегда найдете так называемые "доп. материалы", и они по праву являются украшением. В индустрии компьютерных и видеоигр только начинается подобное движение. Причем мы уже можем говорить об огромных тиражах, фирменных боксах с бонусами, разработчики выпускают специальные add-on'ы. Но обычно непосредственно о самой разработке рассказывают мало за исключением рекламных интервью, где руководитель водит журналиста по офису и говорит: "Здесь отдел 3D-анимации, здесь делается физика… а здесь мы спим, если сильно задерживаемся на работе". Мы же в данной небольшой серии начнем публикации по основным технологиям, алгоритмам и стандартам, используемым в разработке компьютерных игр. При этом не будем привязываться к конкретному языку программирования, а опишем саму суть происходящего.

Начало


Первые игры писались учеными и для ученых. То есть уже в 50-х прошлого века на экранах осциллографов с помощью ламп и различных рукояток и кнопок умудрялись создавать крестики-нолики и теннис. В 1951-м Алан Тьюринг написал один из первых шахматных алгоритмов — правда, машины не были тогда развиты до должного уровня, и Тьюринг сам выполнял их роль. Так появилось понятие "бумажная машина Тьюринга". По своим алгоритмам автор тратил около получаса для расчета одного хода. Непосвященные могут подумать, что Тьюринг не умел играть в шахматы. Напротив. Он просто написал математический алгоритм, который впоследствии можно применять и в рамках машин. В том же 1951 году автор Теории Информации Клод Шеннон написал первую статью в истории по программированию шахмат, где выделил две основные стратегии для поиска лучшего хода, чем пользуются и поныне. Даже более того, первая шахматная программа появилась в 1952 году. Это было сделано в ядерной лаборатории Лос-Аламоса на компьютере с жестким названием MANIAC1. Этот "маньяк" имел тактовую частоту 11 КГц и память на 600 слов. Сама программа предусматривала шахматную доску 6х6, а на расчет четырех полуходов тратилось 12 минут. Далее это начало развиваться как отдельное направление, которое затронуло и такую перспективную нишу, как искусственный интеллект (ИИ). Было даже некое подобие соревновательности между СССР и США, хотя в то время кибернетика у нас считалась лженаукой и находилась в опале. В 60-х появилась возможность подключения к компьютеру телевизора. Это придумал Ральф Бэр, что предопределило начало эры чисто игровых компьютеров и потом выросло в целое направление, которое мы сейчас имеем в виде множества различных приставок и игровых консолей. В 70-80-х компьютерные игры стали неотъемлемой частью индустрии развлечений. Изначально очень большой интерес к ним был проявлен со стороны владельцев залов игровых автоматов. Их прибыли были баснословными. Помимо этого появилось множество различных вариантов компьютеров для более-менее пользовательского кошелька. Их покупали процентов на 90 только из-за игр.

Поворот башни танка

Почему во всем мире доминирующей стала платформа РС (или, как говорили раньше, "IBM-совместимых")? Тоже во многом благодаря играм. Руководство Microsoft это понимало всегда, и первое, что они делают, меняя ОС, — предоставляют новые возможности для разработчиков игр. Например, приход Windows Vista плотно связан с появлением DirectX 10. А сам DirectX появился в первую очередь для того, чтобы игры в Windows были лучше, чем в MS- DOS, от которого долго не хотели отказываться. На данный момент ниша компьютерных игр является самой перспективной и бурно развивающейся. Над музыкальным сопровождением к крупным проектам работают известные голливудские композиторы, аудио- и видеоспецэффекты не уступают современному кино, а удачный выход какой-либо новинки можно вполне сравнивать с выпуском блокбастера. Правда, кино сейчас до сих пор приносит большие деньги, но, судя по развитию компьютерных игр, скоро все станет финансово сопоставимым. Даже более того, у разработчиков игр уже есть своя звездная дорожка славы, которая по аналогии с синематографом называется "Hall of Game". Будущее данного направления видится самым радужным.

Нужно ли увлечься разработкой вам?

А как вы сами думаете? Это практически одна из немногих сфер, где прибыли могут на несколько порядков превышать стоимость разработки. Конечно, сегодня это большей частью относится к самым популярным играм, а также к так называемым казуальным. Под казуальными (для тех, кто не знает) следует понимать небольшие простые логические игрушки. Представьте себе, сколько заработали на том же Тетрисе или Марио. Сейчас разработка чего- то подобного занимает от одного до трех месяцев, а с помощью сетей распространения игра может продаваться на огромную аудиторию. Но следует отметить, что данный бизнес такой же, как и любой другой, то есть имеют место и неудачи, причем это случается нередко. К тому же, сейчас наступил жанровый и идейный кризис. Есть множество повторяемости, и иногда она окупается больше, чем продвижение новой идеи. Хотя в современном геймдеве (GameDev: от Game Development — разработка игр) многие проблемы связаны с дефицитом хороших сюжетов — их на самом деле очень мало. Причем разработчики зачастую уже не следят за таким важным моментом, как основная мотивация игрока, отдавая предпочтение созданию кратковременных и, в принципе, стандартных целей. Но рынок очень динамичен, существует явный и большой спрос. Это сравнимо с кино, когда потребитель увидел одно и, впечатлившись, хочет чего-то другого. Индустрия заманивает. Так что на современном этапе в геймдеве благодатных ниш очень много. Также уже выпущены очень хорошие учебники — практически все ключевые технологии объяснены популярным языком.

Вот как два варианта ListBox'ов могут выглядеть внешне. Это демонстрационная программа, написанная во флэше. (с) Кристофер

Если вы решили заняться разработкой компьютерных игр (не казуальных), то вам придется научиться работать в команде, привыкнуть к авральным режимам, а также множеству интересного обновляющегося, что потребуется изучать постоянно. Профессий, связанных с геймдевом, достаточно много — порядка 20-30. Так что стартуйте, а мы пока начнем "технологические раскопки".

Алгоритмы, алгоритмы…

Не так давно мне принесли игру в жанре RTS (real-time strategy — стратегия реального времени). Операций она выполняла на порядок меньше, чем Warcraft III, хотя графический движок (что это такое, рассмотрим позже) был похожим, но… компьютер, на котором третий Warcraft шел как по маслу, в данном случае просто трещал по швам, ресурсов периодически не хватало. Были вылеты. Юниты вели себя неадекватно. То есть понятно, что были проблемы и с искусственным интеллектом — компьютерный соперник играл однообразно. Кстати, недостатки в ИИ виртуального соперника были якобы залакированы под надписью: "…больше предназначена для игры по сети между людьми". Очевидно, что тут мы сталкиваемся с полностью неоптимизированной разработкой, сделанной по неким шаблонным принципам на высоком уровне (имеется в виду, есть низкоуровневое программирование — это большей частью C и ассемблер, а есть и высокоуровневое — все современные языки и скрипты). Видна быстрая скорость написания без вникания в саму суть. А ведь все можно делать по-разному.

Обычная вертикально-горизонтальная карта

Простейший и классический пример. Возьмем такой юнит, как танк из RTS старого типа, вид сверху. Данный юнит ездит, вертит башней с пушкой и стреляет. Для того, чтобы показать поворот башни, можно предусмотреть несколько вариантов. Самый тривиальный и ресурсоемкий — нарисовать анимацию, состоящую из множества рисунков танка с поворотом башни либо применив tweening (автоматизированное построение промежуточных отображений), а можно поступить и по-другому. Например, сделать два слоя: первый — статический корпус машины, а второй — это башня, поворот которой мы делаем математическим способом. Другой пример применения нескольких подходов. В каждой игре (и в обычном ПО тоже) есть такие элементы, как ListBox'ы. Простыми словами, это выводимый список со скроллингом. В стандартном ПО обычно применим только один подход, а именно создается панель, на которую помещаются Item'ы, увеличивая ее размер строку за строкой, все прячется за маскирующим (Mask) элементом, ну и прокрутка делается стандартно. Но есть и другой вариант, который часто можно встретить именно в играх, а именно в качестве интерфейса используется определенное количество стандартных элементов — текстовых полей, а сами строки текста (Item'ы) запоминаются в массив. И в данном случае мы "крутим" не панель с текстом под маскирующим элементом, а массив по текстовым полям. То есть мы имеем только эмуляцию прокрутки. Внешней разницы для обоих вариантов, если это делал хороший программист, вы и не увидите. Почему мы остановились на этом примере? Просто сейчас начнем описывать технологии не с того времени, когда использовалась пиксельная графика, а чуть позже, когда игры стали подразумевать большие миры, следовательно, были необходимы огромные карты, а ресурсов компьютеров, как всегда, не хватало.

Карты миров

Представьте себе 90-е и компьютеры, которые тогда были. Если сохранить карту размером в четыре или больше экранов в формат BMP, то она смело займет весь объем HDD тех лет. Поэтому изначально было придумано использовать двухмерную сетку, состоящую из квадратов. Расположена она строго вертикально-горизонтально. В каждый квадрат, именуемый блоком, загружается отдельная картинка с изображением того, что именно находится в данном месте. То есть, если песок, то песок, участок дороги — дорога, построенное здание — строение. Соответственно, все можно хранить в двухмерном массиве, а если вы что-то изменили на карте, то это легко сохранить. В принципе, разницы между тем, что мы сейчас будем говорить о массивах, или же, скажем, словосочетанием "база данных", совершенно нет. Экономия получилась отличной, поскольку любая карта имеет множество идентичных элементов (например, зона песка, лесной массив) и т.д. И сам алгоритм, кстати, очень сильно напоминает то, как работают архиваторы. Таким образом, видя карту в стратегической игре старого поколения, вы наглядно наблюдаете архивацию данных, ее основополагающий принцип. При этом, говоря о двухмерной карте, мы подразумеваем многомерный массив, который за ней стоит. То есть каждая клетка может описываться множеством параметров, и помимо названия файла изображения там могут указываться, например, параметры тумана, проходимость и т.д. При прокрутке в двухмерной сетке экрана мы просто меняем численный порядок элементов — это простейшая математика. Кстати, подобные реализации с вертикально- горизонтальной картой сейчас часто можно увидеть в компьютерных играх для мобильных телефонов, особенно если речь заходит о прохождении чего- либо и виде сверху.

Ортогональная карта

Но хотелось трехмерности, а на нее ресурсов никак не хватало. Решение нашли весьма интересное. То есть просто повернули нашу двухмерную сетку на 45 градусов по двум осям. В результате, образно говоря, квадраты-блоки стали ромбами, а сама сетка получила название изометрической. Что это дало в итоге? Кто проходил предмет черчения, знает, что такое вид сверху и проекция в объеме, хотя в обоих случая все выводится на 2D. Точно такой же эффект восприятия мы получили в изометрических картах. В результате по восприятию они стали более объемными. Мало того, они уже определенно и бесповоротно стали многослойными. То есть игрок может указать уровень высоты ландшафта и увидеть это наглядно (представьте, как бы это выглядело на "квадратной" двухмерной карте), на ландшафте можно размещать деревья, различные элементы и т.д. Технологически это наслоение одного изображения на другое, для реализации, как известно, используются альфа-каналы (прозрачность) и т.д. Причем, если объект помещается в блок, но превышает его по размерам (например, дерево или здание), то на определенном слое он (этот блок) просто меняется по размерам. Это очень удобно. У многослойности есть ряд преимуществ, потому как структуры можно быстро менять — например, песок на траву и т.д. независимо от того, что находится на других уровнях-слоях. С изометрией в одно время начали делать ряд экспериментов-усовершенствований. Например, в большинстве игр, связанных с экономическими стратегиями, предусмотрели поворот на 90 градусов, то есть карту стало возможно просматривать с четырех сторон. В других вариантах предусмотрели изменение угла наклона просмотра.

Одна из первых реализаций в области трехмерных карт

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

В завершение

На этом мы сегодня остановимся. Вводная часть, можно сказать, пройдена. Далее обратимся к более конкретным вещам, причем современным, то есть 3D, рассмотрим основные движки и технологии.

Кристофер, christopher@tut.by


Компьютерная газета. Статья была опубликована в номере 18 за 2008 год в рубрике технологии

©1997-2022 Компьютерная газета