От переводчика: эта статья написана Дэвидом Кушнером в 2002 году, годом позже он издал известную книгу «Masters of Doom». Статья показалась мне интересной, потому что в ней есть подробности реализации технологий id, почему-то отсутствующие в книге.
За кулисами экшена и агрессии игр id скрыта революция в технологии настольных компьютеров
В течение последних 12 лет эволюция реализма графики Id Software поднимает планку для всей отрасли видеоигр. Среди игр-новаторов находятся [снизу вверх, справа налево] Commander Keen (1990) [прим. пер.: на самом деле на скриншоте Dangerous Dave in the Haunted Mansion], Hovertank (1991), Wolfenstein 3D (1992), Doom (1993), Quake (1996) [прим. пер.: на самом деле Quake II] и Return to Castle Wolfenstein (2001).
После полуночи начинается схватка. Солдаты преследуют нацистов по коридорам замка. Огнемёт изрыгает чудовищный язык пламени. Это Return to Castle Wolfenstein, компьютерная игра, ставшая не только спинномозговым приключением, но и чудом науки. Она же — последний продукт Id Software (Мескит, штат Техас). Благодаря своим технологически инновационным играм id оказала огромное влияние на мир компьютерных вычислений: от привычных в современных PC высокоскоростных полноцветных графических карт высокого разрешения до появления армии программистов и игроков в онлайновые игры, внёсших вклад в поп-культуру.
id заявила о себе 10 лет назад выпуском своей оригинальной игры об охоте за нацистами — Wolfenstein 3D. В ней и в её последователях — Doom и Quake — игроки управляли находящимися в опасности солдатами-пехотинцами, носящимися по лабиринтам и охотясь на монстров или друг на друга. Чтобы вывести эти игры на рынок потребительских PC и завоевать звание лидера рынка, компании id мастерски упрощала сложные графические задачи и виртуозно пользовалась технологическим прогрессом графических карт, вычислительной мощности и размеров памяти. На сегодняшний день, по данным NPD Group, игры компании заработали на продажах более 150 миллионов.
Всё началось с парня по имени Марио
Своим успехом id во многом обязана техническим умениям Джона Кармака, 31-летнего ведущего программиста и сооснователя компании, создающего игры с подросткового возраста.
В конце 1980-х в индустрии электронных игр доминировали специализированные видеоигровые консоли. Большинство игр распространялось на картриджах, вставляемых в консоли, поэтому для их написания требовались дорогие системы разработки и поддержка корпораций.
Единственной альтернативой было программирование игр для домашних компьютеров, андерграундного мира, в котором новички могли разрабатывать и распространять своё ПО. Для создания игр на слабых машинах достаточно было только навыков программирования и любви к играм.
Среди страстно влюблённых в игры было четыре человека: художник Адриан Кармак, программист Джон Кармак (не родственник), дизайнер игр Том Холл и программист Джон Ромеро. Работая на мелкого издателя ПО Softdisk (Шривпорт, штат Луизиана), эти заядлые геймеры начали втайне создавать собственные игры.
В те времена к PC относились как к исключительно рабочей платформе. В конце концов, у него было всего с десяток экранных цветов, а звуки издавались пищащим небольшим динамиком. Тем не менее, геймеры из Softdisk поняли, что этого будет достаточно, чтобы сделать PC игровой платформой.
Сначала они решили проверить, смогут ли воссоздать на PC крупнейший хит игровой индустрии того времени — Super Mario Brothers 3. Это двухмерная игра для Super Nintendo Entertainment System [прим. пер.: на самом деле, для Nintendo Entertainment System], в которую играли на экране обычного телевизора. Цель игры — управляя усатым сантехником по имени Марио, прыгать по платформам, уворачиваться от угроз и бегать по миру под синим небом и облаками. Когда Марио бежал, уровень скроллился слева направо, чтобы персонаж всегда находился примерно посередине экрана. Чтобы достичь необходимой скорости графики, в консоли Nintendo использовалось специализированное оборудование. «У нас были наглядные примеры консольных игр [таких как Mario], в которых присутствовал плавный скроллинг», — рассказывает Джон Кармак. «Но [в 1990 году] никто не смог сделать то же самое на IBM PC».
После нескольких ночей экспериментов Кармак придумал, как эмулировать сайд-скроллинг на PC. Изображение экрана в игре отрисовывалось или рендерилось сборкой массива тайлов размером 16 на 16 пикселей. Обычно для экранного фона требовалось более 200 таких квадратных тайлов: тайл синего неба здесь, тайл облака там, и так далее. Графика активных элементов, таких как Марио, отрисовывалась поверх фона.
Все попытки перерисовки всего фона в каждом кадре приводили к слишком медленной работе игры, поэтому Кармак придумал, как перерисовывать за каждый кадр только небольшое количество тайлов, что значительно увеличило скорость игры. Эта техника использовала возможности недавно выпущенного типа графических карт и основывалась на наблюдении о том, что движение игрока происходит постепенно, то есть бо́льшая часть объектов следующего кадра уже отрисована в текущем.
Новые графические карты были известны как карты Enhanced Graphics Adapter (EGA). У них было больше встроенной видеопамяти, что у карт Color Graphics Adapter (CGA) и они могли отображать одновременно не четыре, а 16 цветов. Для Кармака расширенная видеопамять имела два важных последствия. Во-первых, хотя память карты и была предназначена для одного экранного изображения с относительно высоким разрешением, она могла хранить несколько видеоэкранов изображений низкого разрешения, обычно 300 на 200 пикселей, что достаточно много для видеоигр. Указывая на различные адреса в видеопамяти, карта могла выбирать изображение, передаваемое на экран примерно 60 раз в секунду, обеспечивая плавную анимацию без раздражающего мерцания. Во-вторых, карта могла перемещать данные внутри видеопамяти гораздо быстрее, чем можно было скопировать данные изображений из основной памяти PC в карту. Это позволяло избавиться от главного «бутылочного горлышка» скорости графики.
Кармак написал так называемый движок отображения графики, в котором по максимуму использовались оба этих свойства. В нём была применена техника, изначально разработанная в 1970-х для прокрутки больших изображений, таких как спутниковые фотографии. Сначала он собирал весь экран в видеопамяти, тайл за тайлом, плюс граница шириной один тайл [см. иллюстрацию «Скроллинг с действием»]. Если игрок перемещался на один пиксель в любом направлении, движок отображения перемещал исходную точку передаваемого на экран изображения на один пиксель в соответствующем направлении. При этом не нужно было отрисовывать новых тайлов. Когда движения игрока наконец передвигали экранное изображение к внешней стороне границы, движок всё равно не перерисовывал бо́льшую часть экрана. Вместо этого он копировал почти всё готовое изображение — ту часть, которая не изменилась — в другую часть видеопамяти. Затем он добавлял новые тайлы и перемещал исходную точку отображения экрана, чтобы она указывала на новое изображение.
Скроллинг с действием: для создания двухмерного скроллинга в PC-игре программист Джон Кармак немного сжульничал тем, что отказался от перерисовки экрана в каждом кадре. Он построил хранящийся в видеопамяти фон из графических тайлов [слева], но отправлял на экран только часть изображения [слева вверху, внутри оранжевой границы]. Когда персонаж игрока [жёлтый круг] перемещался, передаваемый на экран фон изменялся таким образом, чтобы включить в себя тайлы за пределами границы [справа вверху]. Новые элементы фона требовались только после смещения на ширину одного тайла. Затем бо́льшая часть фона копировалась в другую область памяти [справа внизу] и экранное изображение центрировалось на новом фоне.
Если вкратце, то вместо того, чтобы заставлять PC перерисовывать десятки тысяч пикселей при каждом перемещении игрока, движку обычно достаточно было изменить только единственный адрес в памяти — тот, который указывал на исходную точку экранного изображения — или, в худшем случае, отрисовать относительно тонкую полосу пикселей с новыми тайлами. Поэтому у ЦП компьютера оставалось куча времени для других задач, таких как отрисовка и анимация движущихся платформ игры, враждебных персонажей и других активных элементов, с которыми взаимодействовал игрок.
Холл и Кармак подготовили клон Mario для PC, который они назвали Dangerous Dave in Copyright Infringement. Но их нанимателя, Softdisk, не интересовало издание игр для дорогих тогда EGA-карт, он предпочитал придерживаться рынка приложений для CGA. Так зарождающаяся компания id Software ушла в тень и использовала свою технологию для создания собственного сайдскроллера для PC под названием Commander Keen. Когда дело дошло до выпуска игры, они связались с издателем игр Скоттом Миллером, который убедил их воспользоваться схемой распространения столь же новой, как и их движок: shareware.
В 1980-х хакеры начали продавать свои программы по модели shareware, полагавшейся на кодекс чести: попробуй ПО, и если оно тебе понравится, плати. Но она использовалась только утилитарных программ, таких как файловые инструменты или текстовые процессоры. Миллер решил, что следующим рубежом станут игры. Он говорил: вместо того, чтобы отдавать игру целиком, почему бы не отдать только первую часть, чтобы заставить игрока купить остальное? id согласилась, чтобы компания Миллера Apogee выпустила игру. До Commander Keen самая успешная shareware-игра Apogee была продана тиражом всего несколько тысяч копий. Но уже через несколько месяцев после выпуска Keen в декабре 1990 года её тираж составил 30 тысяч копий. По воспоминаниям Миллера, для зарождающегося мира PC-игр «это было как маленькая атомная бомба».
Добавляем глубину
Тем временем программист Кармак продолжал расширять возможности графики. Он экспериментировал с 3D-графикой ещё со средних классов школы, создавая на своём Apple II каркасные логотипы MTV. С тех пор некоторые создатели игр экспериментировали с трёхмерной графикой от первого лица, в которой плоские тайлы двухмерных игр заменялись полигонами, формирующими поверхности окружающего игрока пространства. Игрок больше не чувствовал себя за пределами мира, он видел его изнутри.
Однако результаты получались противоречивыми. PC были слишком медленными, чтобы перерисовывать подробные 3D-сцены при перемещении игрока. Им приходилось отрисовывать множество поверхностей для каждого кадра, передаваемого на экран, в том числе те, которые были перекрывались другими поверхностями ближе к игроку.
У Кармака была идея, которая позволила бы компьютеру отрисовывать только те поверхности, которые видимы игроку. «Если вы готовы ограничить универсальность своего подхода», — говорит он, — «то почти всегда сможете добиться большего».
Поэтому он не стал решать общую задачу отрисовки произвольных полигонов, которые могут находиться в произвольном месте пространства, а разработал программу, которая будет отрисовывать только трапеции. В то время его волновали стены (которые в 3D имеют форму трапеции), а не потолок или пол.
Для своей программы Кармак упростил технику, использовавшуюся на мощных системах того времени для рендеринга реалистичных изображений. При так называемой трассировке лучей (raycasting), компьютер отрисовывает сцены, проводя линии из точки местонахождения игрока в направлении его взгляда. Когда линия сталкивается с поверхностью, пиксель, соответствующий этой линии на экране игрока, закрашивается соответствующим цветом. Вычислительное время компьютера не тратится на отрисовку поверхностей, которые всё равно не будут видны. Отрисовывая только стены, Кармак мог очень быстро воссоздавать сцены с помощью трассировки лучей.
Последней задачей Кармака стало украшение 3D-мира сундуками с сокровищами, врагами и другими объектами. Он снова упростил задачу, на этот раз использовав двухмерные графические значки, называемые спрайтами. Он заставил компьютер масштабировать размер спрайта в зависимости от положения игрока, чтобы ему не пришлось моделировать объекты как трёхмерные фигуры (иначе производительность игры сильно снизилась бы). Объединив спрайты с трассировкой лучей, Кармаку удалось поместить игроков в быстрый 3D-мир. Результатом этой работы стала игра Hovertank, выпущенная в апреле 1991 года. Это был первый быстрый 3D-шутер от первого лица для PC.
Примерно в то же время его коллега-программист Ромеро услышал о новой графической технике под названием «наложение текстур» (texture mapping). Эта техника позволяла накладывать на поверхности вместо сплошной однотонной раскраски реалистичные текстуры. В следующей игре компании, Catacombs 3D, игрок бегал по лабиринту, стреляя огненными шарами во врагов с помощью ещё одной новинки — руки, нарисованной в нижней части экрана. Как будто игрок смотрел на собственную руку, протянутую в экран компьютера. Добавив в Catacombs 3D руку, id Software сделала аудитории серьёзное психологическое заявление: теперь вы не просто играете в игру — вы в ней находитесь.
Мгновенная сенсация
Для следующей игры id, Wolfenstein 3D, Кармак усовершенствовал свой код. Ключевым решением, позволявшим графическому движку делать как можно меньше работы, стало следующее: чтобы упростить отрисовку стен, все они должны быть одной высоты.
Это значительно ускорило трассировку лучей. При стандартной трассировке лучей одна линия проецируется через пространство для каждого отображаемого пикселя. Для привычного тогда экранного изображения размером 320 на 200 пикселей требовалось 64 000 линий. Но так как стены Кармака были одинаковыми сверху донизу, ему нужно было выполнять трассировку только по одной горизонтальной плоскости, то есть всего 320 линий [см схему «Трассировка лучей в 3D-комнатах»].
Трассировка лучей в 3D-комнатах: для быстрой отрисовки трёхмерных комнат без отрисовки перекрытых, то есть ненужных поверхностей, Кармак использовал упрощённую систему трассировки лучей, техники, использованной для создания реалистичных 3D-изображений. При трассировке лучей компьютер отрисовывает сцены, проводя линии из точки обзора игрока [сверху] через воображаемую сетку так, что они сталкиваются с видимыми игроком поверхностями. При этом отрисовываются только такие поверхности.
Кармак упростил технику, сделав все стены одной высоты. Это позволило испускать лучи от игрока только в одной горизонтальной 2D-плоскости [посередине] и масштабировать видимую высоту стены согласно её удалённости от игрока вместо определения каждой отдельной точки стены. В результате получалось конечное 3D-изображение стен [снизу].
Движок Кармака стал невероятно быстрым, и Ромеро, Адриан Кармак и Холл решили создать жестокую игру, в которой американский солдат должен был уничтожать нацистов, пробираясь через лабиринты уровней. После выпуска в мае 1992 года Wolfenstein 3D мгновенно стал сенсацией и чем-то вроде визитной карточки PC. Когда Intel хотела продемонстрировать журналистам скорость своего нового процессора Pentium, она показала систему с запущенным Wolfenstein.
Кроме того, Wolfenstein дал игрокам неожиданную свободу — они могли изменять игру, дополняя её собственными уровнями и графикой. Вместо офицеров-нацистов, игроки могли, например, использовать звезду американских телешоу — фиолетового динозавра Барни. Кармак и Ромеро никоим образом не пытались преследовать создателей таких «мутировавших» версий Wolfenstein. Их, как хакеров, такая деятельность только радовала.
В их следующей игре — Doom — были добавлены два важных эффекта, над которыми экспериментировал Кармак в процессе работы над другой игрой 1992 года, Shadowcaster, в компании Raven. Первый — это наложение текстур на потолки и полы, а не только на стены. Второй — добавление ослабления освещения. Такое освещение означало, что, как и в реальной жизни, отдалённые объекты затенялись, в то время как в Wolfenstein каждая комната была ярко освещена, без вариаций оттенков.
К тому времени Кармак уже программировал для карт Video Graphics Adapter (VGA), вытеснивших карты EGA. Стандарт VGA позволял использовать 256 цветов — большой прогресс по сравнению с 16 цветами EGA, но по-прежнему недостаточно для реализации всего затенения, необходимого эффектам ослабления освещения.
Решение заключалось в ограничении палитры графики игры, благодаря которому можно было использовать 16 оттенков каждого из 16 цветов. Затем Кармак запрограммировал компьютер на отображение различных оттенков на основании положения игрока в комнате. Самые тёмные оттенки цвета применялись к дальним частям комнаты. Ближние поверхности всегда были ярче, чем далёкие. Это добавило игре атмосферы погружения.
И Кармак, и Ромеро хотели избавиться от простых схем, использовавшихся в уровнях их предыдущих игр. «Весь мой подход был таким — давайте вообще не будем повторять ничего из того, что было в Wolfenstein, — говорит Ромеро, — пусть не будет таких же уровней освещения, пусть не будет такой же высоты потолков, пусть стены не будут под углом в 90 градусов [относительно друг друга]. Давайте продемонстрируем новую технологию Кармака, создав нечто совершенно иное».
Воспользовавшись прогрессом в скорости и объеме памяти компьютеров, Кармак начал работу над задачей отрисовки полигонов с более произвольными формами, чем трапеции в Wolfenstein. «Похоже было на то, что [графический движок] будет недостаточно быстрым, — вспоминает он, — поэтому нам пришлось искать новый подход… Я понимал — чтобы обеспечить скорость, у нас по-прежнему должны быть строго горизонтальные полы и вертикальные стены». Решением задачи стала техника, известная как двоичное разбиение пространства (binary space partitioning, BSP). Генри Фукс, Цви Кедем и Брюс Нейлор, работавшие в Bell Labs, в 1980-х годах популяризировали техники BSP, использовавшиеся для рендеринга 3D-моделей объектов на экране.
Фундаментальная проблема преобразования 3D-модели объекта в экранное изображение заключается в определении того, какие поверхности являются видимыми, то есть сводится к вычислениям: где находится поверхность Y относительно поверхности X, перед ней или за ней? Традиционно эти расчёты выполнялись при каждом изменении положения модели.
В технике BSP использовалось следующее наблюдение: сама модель статична, и хотя различные её положения создают различные изображения, отношения между поверхностями на самом деле остаются неизменными. BSP позволяла определить эти отношения один раз, а потом хранить их таким образом, что для определения поверхностей, скрытых другими поверхностями с любой произвольной точки обзора, нужно было найти соответствующую информацию, а не вычислять всё заново.
BSP берёт пространство, занятое моделью, и разбивает его на две части. Если какая-то из частей содержит более одной поверхности модели, то она разбивается заново, и так далее, пока пространство не будет полностью разбито на части, содержащие одну поверхность. Получающаяся иерархия ветвления называется BSP-деревом и простирается на все операции, от первоначального разбиения пространства до отдельных элементов. Двигаясь по определённому пути через узлы сохранённого дерева, можно сгенерировать ключевую информацию о связях между поверхностями с конкретной точки обзора модели.
Кармак задался вопросом: можно ли использовать BSP для создания не просто одной 3D-модели объекта, а целого виртуального мира? Он снова упростил задачу, введя ограничение: стены должны быть вертикальными, а полы и потолки — горизонтальными. То есть BSP можно использовать для разбиения не самого 3D-пространства, а гораздо более простого двухмерного плана этого пространства, сохранив при этом всю важную информацию о взаимном расположении поверхностей [см. схему «Разделяй и властвуй»].
Иллюстрация: Арманд Венециано
Разделяй и властвуй: «Doom воспринимает все [поверхности трёхмерного мира] как линии, — рассказывает Кармак, — разбиение линий и сортировка линий намного проще, чем сортировка полигонов… Весь смысл в том, чтобы взять BSP[-деревья] и применять их к… плоскости, а не к полигонам 3D-мира, что значительно упрощает задачу».
Кроме того, Doom был спроектирован таким образом, чтобы облегчить работу хакерам, дополняющим игру собственными графикой и уровнями. В Doom была добавлена игра по сети, позволяющая нескольким игрокам сражаться по локальной сети или через модем.
Игра была выпущена в декабре 1993 года. Благодаря многопользовательскому режиму, расширяемости, привлекательной графике и качественным уровням, погружавшим игрока в футуристический мир космического десантника, сражающегося против легионов ада, она стала настоящим феноменом. В сиквеле, Doom II, появилось больше оружия, новые уровни, но сама игра использовала тот же движок. Она была выпущена в октябре 1994 года, и продажи составили 1 500 000 копий, примерно по 50 долларов каждая. По данным NPD Group, она остаётся третьей в списке компьютерных игр-бестселлеров.
Финишная черта
В середине 1990-х Кармак почувствовал, что технологии PC стали достаточно мощными, чтобы в следующей игре, Quake, можно было достичь следующих двух целей. Он хотел создать произвольный 3D-мир, в котором настоящие 3D-объекты можно рассматривать с любого угла, в отличие от плоских спрайтов Doom и Wolfenstein. Решение заключалось в том, чтобы использовать мощь последнего поколения PC и применить BSP для разбиения объёма действительно трёхмерного пространства, а не просто областей двухмерного плана. Также он хотел создать игру, в которую можно было бы играть через Интернет.
Для игры через Интернет была использовала клиент-серверная архитектура. Сервер (который мог быть запущен на любом PC) должен обрабатывать всё среду игры, состоящую из комнат, физики движущихся объектов, положений игроков и так далее. Клиентский PC обрабатывает вводимые игроком через клавиатуру и мышь данные, а также выводимую в виде графики и звука информацию. Однако при онлайн-подключении игра подвержена задержкам и потерям сетевых пакетов, и это мешает быстрой и активной игре. Чтобы снизить влияние этих помех, id ограничила передачу пакетов только самой необходимой информацией, например, положением игрока.
«Решение заключалось в использовании для передачи всех данных ненадёжного канала, — говорит Кармак, — мы пользовались преимуществами непрерывной передачи пакетов и использовали [более медленную] надёжную передачу только для установки связи и корректировки ошибок». Для снижения нагрузки на сеть также использовались различные способы сжатия данных. Удобство многопользовательского режима новой игры — Quake — было вознаграждено появлением огромного онлайн-сообщества после выпуска проекта в июне 1996 года.
Важность качества графики
Игры стимулировали эволюцию видеокарт. Но именно многопользовательские игры создали неутолимый спрос на всё более совершенные графические системы, придав рынку наиболее значимый импульс. Бизнес-пользователей не волновало, будет ли их графическая карта, которую они используют для чтения электронной почты, обновлять экран 8 раз секунду, в то время как карта соседа обновляет экран 10 раз в секунду. Но для играющего в Quake геймера, в которой разница между жизнью и смертью измерялась в десятых долях секунды, это был очень важный вопрос.
Вскоре Quake де-факто стал показателем производительности для отрасли потребительских видеокарт. Дэвид Кирк, ведущий исследователь NVIDIA, ведущего производителя графических процессоров (Санта-Клара, штат Калифорния): «Игры id Software всегда подталкивали развитие прогресса».
Quake II стал улучшенной версией своего предшественника, воспользовавшись преимуществами аппаратного ускорения, которое можно было использовать на PC для переноса большей части работы по рендерингу 3D-сцен с центрального процессора на видеокарту. Quake III, выпущенный в декабре 1999, сделал ещё один шаг вперёд и стал первой заметной игрой, в которой аппаратное ускорение стало обязательным. Это напоминает то, как id хотела «сжечь мосты» в 1990 году, настаивая на использовании в Commander Keen EGA вместо CGA.
Сам Кармак считает, что важнейшие инновации содержались в Quake. Всё после Quake, говорит он, стало, в сущности, усовершенствованием темы. Например, Return to Castle Wolfenstein был основан на движке Quake III, а бо́льшую часть уровней и игровой логики создавала сторонняя компания.
«На этом пути были критически важные точки развития, — рассказывает Кармак, — сначала переход к виду от первого лица, потом произвольные 3D-миры, затем — аппаратное ускорение… Но с важнейшими задачами мы справились. По-прежнему можно усовершенствовать все эти аспекты, но… мы уже можем создать любой мир с определённой степенью точности. Мы можем усовершенствовать качество, спецэффекты и всё подобное. Но у нас уже есть фундаментальные инструменты, необходимые для создания игр, являющихся симуляцией мира».
Автор: PatientZero