Какие технические уловки помогали создавать видеоигровую классику
Разработка видеоигр — это искусство. Когда так говорят, чаще всего имеют в виду сочетание сюжета, геймплея, геймдизайна и сеттинга. За кадром остается титаническая работа: написание кода и оптимизация видеоигр. Не трудись разработчики над требованиями своих проектов к железу, на консолях нового поколения мы бы играли в игры уровня первой Silent Hill. В совместном материале с образовательной компанией «Нетология» N + 1 рассказывает, как менялся подход к созданию видеоигр от эпохи Марио до нашего времени.
История усатого водопроводчика началась не с Super Mario Bros. — впервые он появился в видеоигре Donkey Kong 1981 года, которая разрабатывалась для аркадных автоматов. Однако именно благодаря домашней консоли NES/Famicom, появившейся в 1983 году, Марио не только проник в гостиные игроков, но и помог индустрии видеоигр пережить кризис, связанный с перенасыщением рынка консолей и растущим интересом к персональным компьютерам.
Шутка ли: Nintendo выпустила консоль NES на американском рынке максимально похожей на проигрыватель видеокассет, чтобы она не напоминала покупателям о провалившихся приставках.
По меркам своего времени NES была консолью нового поколения, но разработчики сталкивались с огромными аппаратными ограничениями. В их распоряжении находилось всего 2Кб оперативной и 2Кб видеопамяти. Консоль использовала в качестве носителя картридж, стандартный размер которого составлял всего 48Кб. Таким образом, скриншот с игрой Super Mario Bros. может весить больше, чем сама игра.
Мозг Бендера
Процессор приставки NES был основан на ядре знаменитого MOS 6502, который, помимо сотни других применений, управлял роботом Бендером из Футурамы. И хотя разработчикам скорее всего не нужно было привыкать к работе с таким процессором, игры им все равно приходилось писать на языке ассемблера. Вот так, к примеру выглядел «Hello, world!» на языке ассемблера для MOS 6502.
a_cr = $0d
bsout = $ffd2
.code
ldx #0
printnext:
lda text,x
beq done
jsr bsout
inx
bne printnext
done:
rts
.rodata
text:
.byte "Hello world!", a_cr, 0
Сложность заключается еще и в том, что у каждого процессора язык ассемблера свой. И хотя они не отличаются до неузнаваемости, работать программа на несоответствующем процессоре, скорее всего, не будет.
В наши дни при разработке некоторых игр, например The Sims 4 и Eve Online, разработчики используют язык Python. «Hello, world!» на нем выглядит существенно проще.
print("Hello, World!")
Графика сложных движений в NES была реализована через спрайты — заранее заданные пиксельные изображения, размерность которых составляла 8 на 8 либо 8 на 16 пикселей. Из-за этого изображения движущихся объектов приходилось разбивать на 4, а то и на 8 спрайтов. А ведь их максимальное количество на экране ограничивалось 64 единицами.
Создатели ранних игр по-разному выходили из этой ситуации. Присмотритесь: облака и кусты в Super Mario bros. имеют один и тот же контур. Это сделано для экономии памяти: если на экран нужно было добавить больше движущихся врагов, чем это позволяла консоль, спрайты попеременно подгружали и удаляли из памяти. Враги при этом «мигали». Такое решение не назовешь самым комфортным для игроков, но зато оно делало игры даже более динамичными, чем представляли создатели NES.
Индустрия самоучек
Во времена NES игры, в отличие от сегодняшних ААА-проектов, создавались небольшими командами, чаще из 3-10 человек. Процесс занимал в среднем 3-6 месяцев, а разработке чаще всего учились на ходу: процесс обучения компьютерным наукам в колледжах и университетах тогда был гораздо ближе к железу, поэтому вчерашним студентам было проще приспособиться к новым устройствам.
Работу художников и композиторов чаще всего выполняли сами программисты: NES одновременно поддерживала всего 14 цветов на экране, а музыка должна была быть закодирована в соответствии с аппаратными ограничениями консоли и дополнительных звуковых чипов — в случае их наличия.
Гейм-дизайну никто специально не обучал. Чаще всего разработчики учились у более опытных коллег или самостоятельно экспериментировали с игровыми механиками. Именно в то время были созданы большинство игровых жанров, которые к настоящему времени обросли стандартами и правилами разработки.
Помощь пришла откуда не ждали. Вставленный в консоль картридж, в отличие, например, от CD-диска, образует с ней единую систему. Издатели быстро поняли, что с помощью техники смены блоков можно увеличить размер игр и продавали разработчикам картриджи с необходимыми расширениями: картридж сам переключал нужное ПЗУ во время игры, и консоль каждый раз получала новые 48Кб. Некоторые игры таким образом весили и по 1Мб (Metal Slader Glory).
В другие картриджи добавлялись усовершенствованные звуковые чипы (Castlevania 3) или батарейки для возможности сохранения игрового процесса (The Legend of Zelda). К сожалению, игрокам, знакомым с NES по ее тайваньскому клону Dendy, это не было доступно: китайские пираты не утруждали себя копированием продвинутых картриджей. Их предпочтения были на стороне сборников «999999 игр в 1».
Кроме того, девкиты (devkit), специальные наборы оборудования и программ для разработки игр, во времена NES (на картинке) сильно отличались от профессиональных отладочных машин, на которых создают игры для Playstation 5. Собственно говоря, чаще всего девкитов, как и хорошей документации, у разработчиков не было вовсе. Им приходилось самим создавать устройства для отладки игр. И хотя, с одной стороны, это было сопряжено с трудностями в разработке, иногда они обнаруживали такие возможности консоли, о которых не догадывались даже ее создатели.
Doom, великий и ужасный хит 1993 года, стал в свое время настоящим system seller’ом для персональных компьютеров. И хотя его портировали на большинство актуальных консолей того времени, там он выглядел почти как Cyberpunk 2077 на Playstation 4.
Команда разработчиков во главе с Джоном Кармаком и Джоном Ромеро не стала уделять особого внимания сюжету. Кармаку принадлежит известная (и относительно плохо сохранившаяся) цитата: «Сюжет в игре — как сюжет в порнофильме. Он должен быть, но совершенно не важен». Таким образом, наибольшее внимание разработчики уделили движку игры и атмосфере. Некоторые демоны лепились из пластилина, фотографировались и позже переносились в игру после обработки в графической программе, а отдельные виды оружия (бензопила) или руки, которые видны в кадре, принадлежали самим разработчикам или их друзьям.
В отличие от создателей игр для приставок предыдущего поколения, разработчики Doom могли использовать язык Си (англ. C) и его преимущества. В первую очередь, гораздо более простой в сравнении с языком ассемблера синтаксис. При этом, поскольку основным носителем игры являлась магнитная дискета, требования к оптимизации памяти оставались существенными. Отсюда — мнимая трехмерность в игре: движок устроен таким образом, что если в игрока выстрелит враг, находящийся перед ним этажом выше, протагонист получит урон.
Вычисления в Doom проводились с частотой 35 раз в секунду. Чтоб сэкономить такты процессора, управление монстрами было оптимизировано: если из одного сектора не была видна ни одна точка другого, в соответствующей ячейке матрицы ставилась единица, а в противном случае — 0. Таким образом, если в ячейке, связывающей сектор протагониста и сектор демона стоит 0, проводится проверка, видит ли демон игрока. Если же стоит единица, игра считает, что игрок в безопасности.
Для ускорения построения изображения использовалось BSP-дерево — метод рекурсивного разбиения евклидова пространства в выпуклые множества. Движок игры поочередно отрисовывал стены от ближних к дальним, и только когда этот процесс был окончен, отрисовывал полы и потолки. Джон Кармак оптимизировал алгоритм: он учел, что для набора полигонов дерево имеет невырожденную структуру, если для каждого полигона из набора все остальные расположены с передней или задней стороны. Также при помощи BSP-дерева в игре обнаруживались столкновения с поверхностями.
Но, видимо, главной фичей Doom engine, родившей целое направление в игровой культуре была возможность записи игрового процесса — так называемые демо-ролики. В этих файлах сохранялся весь игровой процесс: как игрок пробегает уровень, побеждает монстров и какое оружие использует. Игроки обменивались друг с другом роликами, соревнуясь в том, кто красивее или быстрее пробежит уровень на максимальной сложности. Впоследствии это увлечение выросло в отдельную культуру спидранов.
Где взять движок?
Когда Джон Ромеро ушел из Id Software ради создания своего (в будущем провального) проекта Daikatana, ему приходилось несколько раз покупать у бывшей студии видеоигровые движки: сначала это был движок от Quake, затем от Quake II, поскольку процесс разработки затягивался и старый движок терял актуальность. В наше время разработчики застрахованы от этого, ведь движки постоянно обновляются их создателями. Более того, каждый может написать игру на Unity, и если она приносит вам менее ста тысяч долларов в год, за использование движка не придется платить. Научиться создавать игры на одном из самых популярных игровых движков можно, выбрав курс «Разработчик игр на Unity» от «Нетологии».
При упоминании Resident Evil 2, скорее всего, сегодня вспомнят ремейк 2019 года, а не классику первой PlayStation. Для игры был модернизирован движок от предыдущей части, выпущенной в 1996 году. Как и Doom, она была написана на C с некоторыми дополнениями на языке ассемблера. Большинство игр для PS1 писались на этом языке, хотя некоторые крупные проекты, в том числе культовая Crash Bandicoot, частично использовали Lisp.
Игра 1998 года использовала все возможности CD-диска и содержала большое количество видеороликов и звуковых эффектов. Все эти особенности были сохранены при портировании игры на малоизвестную в России Nintendo 64 — консоль, в качестве носителей для которой использовались картриджи объемом до 64 Мб. Но какой ценой?
Чтобы игра не теряла плавность при появлении на экране большого количества зомби, в версии для консоли Nintendo разработчики добавили смену разрешения с 640 на 480 до 320 на 240 в моментах, когда от устройства требовалась высокая производительность.
Перенос видеороликов и вовсе стал наиболее тяжелой задачей. Частота кадров была понижена с 30 до 15 кадров в секунду. Затем к видеороликам применили интерполяцию — кадры становились более размытыми, но их последовательность выглядела достаточно плавной. Также было понижено разрешение видеоряда. А чтобы еще больше сжать видео и сэкономить место на картридже, разработчики в несколько раз уменьшили глубину цветов, сохранив при этом яркость.
Для переноса музыки и озвученных диалогов на Nintendo 64 была разработана система MusyX. Она позволяла создателям порта использовать собственные семплы, а не выбирать из ограниченных библиотек N64. Качество музыки удалось сделать даже выше, чем в версии для PlayStation, ведь MusyX поддерживала Dolby Surround. К сожалению, то же самое нельзя сказать о диалогах. Они сжимались и воспроизводились с более низкой скоростью, что делало их более приглушенными.
Съезжу в отпуск, пока рендерится
При создании задников для Resident Evil 2 разработчики использовали самую современную на тот момент рабочую станцию SGI O2. Но даже так рендер каждого задника занимал от двух до трех недель. В наши дни начинающие разработчики могут использовать бесплатные пререндеренные модели деревьев, автомобилей, зданий — любых необходимых объектов, либо купить за умеренную плату более качественные варианты. И даже если захочется отрендерить что-то новое, а компьютер в качестве последнего свежего тайтла видел только S.T.A.L.K.E.R, можно обратиться к онлайн рендер-фермам.
Все классические GTA, будем называть такими GTA 3, GTA: Vice City и GTA: San Andreas, использовали один и тот же движок — RenderWare. Поскольку все три игры выходили сперва для консолей, в первую очередь для PlayStation 2, разработчикам приходилось уделять значительное внимание оптимизации игр под ее аппаратные ограничения.
Renderware, который давал разработчикам готовое решение для создания графики под PS2 и широкие возможности для своей доработки, был написан на С++. Это язык, который до сих пор занимает центральное место в мире разработки видеоигр, он позволяет очень тонко оптимизировать игру под конкретное железо, будь это ПК или консоль. На RenderWare создавались очень разноплановые игры: от шутеров (Call of Duty: Finest Hour) до гоночных симуляторов (Need for Speed: Most Wanted) и файтингов (Mortal Kombat: Armageddon).
Движок совершенствовался от игры к игре, поэтому Vice City оказалась более производительной, чем GTA III. Разработчики добились этого оптимизацией просчитывания окружения. Если в третьей части игра просчитывает все объекты вокруг игрока, то в Vice City внимание уделяется только тем объектам, которые игрок видит на экране в данный момент. Несмотря на оптимизацию, требования к железу все равно выросли — все-таки качество текстур в Vice City было заметно лучше.
RenderWare умел существенно облегчать консолям и ПК обработку больших локаций. При приближении игрока к объектам их текстуры заменялись на более «тяжелые» детализированные. Ну а чтобы игрок не чувствовал себя одиноким в просторных локациях, разработчики добавили в GTA прохожих, которые играли роль декораций и служили источником легких денег.
При этом, в отличие от, например, S.T.A.L.K.E.R, где жизнь NPC протекала независимо от положения и действий игрока благодаря системе A-Life, в GTA мир живет только вокруг него. Даже в GTA V можно заметить, как пешеходы и автомобили просто исчезают на ровном месте. За это отвечает выбранная в настройках дальность прорисовки: чем она выше, тем больше объектов будут отображаться перед игроком на разных расстояниях. При этом нагрузка на ПК вырастет.
В упомянутом S.T.A.L.K.E.R игрок мог наткнуться на перестрелку враждующих группировок или сражение монстров. Эти события произошли бы и без участия игрока, даже находись он в противоположной точке карты. Впоследствии он мог найти трупы, оставшиеся на поле боя.
Minecraft — яркий пример хита, выросшего из разработки всего одного человека, Маркуса Перссона. Кроме того, это также редкий пример игры, написанной на Java. Трудно представить, что язык, обожаемый крупными корпорациями при создании бэкенда и требующий постоянного внимания к предыдущим версиям, стал основой для одной из самых гибких видеоигр на свете.
Одной из многих особенностей Minecraft является процедурно генерируемый мир. Это не новая технология, более того, она не была новой даже на этапе задумки игры. Проекты, создающие новый мир при каждом запуске появились уже в 1980-х. К числу известных примеров относятся Elite, The Legend of Zelda: A Link to the Past, Diablo II.
При каждом запуске игрок получает совершенно новый мир. Безусловно, имея некоторый опыт в игре, ему будет проще освоиться, однако не стоит рассчитывать найти сундук с золотом на прежнем месте. Эта концепция делает не похожим на предыдущий каждый новый запуск режима выживания в Minecraft. Игрок чувствует себя первопроходцем. При этом некоторые участки карты остаются неизменными — например, отдельные подземелья. Сделано это для того, чтобы, вне зависимости от результатов процедурной генерации, геймплей всегда получался интересным.
Подгрузка мира в Minecraft динамическая. Хоть это и блочная игра с незамысловатой графикой, хранить весь ее огромный мир в оперативной памяти невозможно. Поэтому игра по мере движения игрока подгружает новые блоки вокруг него, а оставшиеся позади — удаляет из игрового мира. При этом после создания мира карта меняться уже не будет. И если игрок вернется в старую точку, игра подгрузит те же блоки, что были там раньше.
Но больше всего поражает даже не это, а что игроки в Minecraft строят в режиме песочницы. В мире этой игры был создан процессор с оперативной памятью 256 байт, названный DjCPU8. В этом процессоре реализован даже ассемблер: стоит увеличить оперативную память, и на нем можно будет написать Super Mario Bros.
У компьютера 8-битная разрядность, но есть проекты и с 16 битами. Реализовано это благодаря механике «редстоуна», особого минерала, добываемого в игровом мире под землей. Блоки редстоуна образуют цепи, передающие энергию от одного к другому, благодаря чему у пользователей есть возможность строить логические схемы. Таким образом в игре был создан жесткий диск с памятью 1Кб и эмулятор древней приставки Atari 2600, позволяющий запускать игры внутри игры.
Cyberpunk 2077. Игра, с которой до нового года управились все, кроме ее создателей. Она была создана на модернизированной версии собственного движка студии CD Project RED — REDengine 4, написанного на C++. Не будем касаться ужасной графики, с которой столкнулись игроки на PlayStation 4. Это — следствие плохой оптимизации игры под предыдущее поколение консолей.
Открытый мир Cyberpunk 2077 не может целиком храниться в памяти компьютера. На это не хватит ресурсов даже самых современных устройств. Поэтому в картах уровней обычно расположены незаметные швы. Кстати, на консолях нового поколения их будет гораздо меньше: создатели PS5, равно как их конкуренты, акцентировали много внимания на ускоренной подгрузке игровых данных в оперативную память. Когда игрок переходит из одной зоны в другую, игра генерирует новые объекты и обрабатывает их взаимодействия. В Cyberpunk 2077 из-за неверно заданных точек появления автомобилей они создаются игрой просто в небе, а затем прописанная в игре физика «опускает» их на землю.
Вскоре после релиза игроки обнаружили, что колясочники, если их атаковать, убегают от протагониста на своих двоих. Объясняется это тем, что в скриптах, отвечающих за взаимодействие игрока с окружающим миром, допущены серьезные ошибки. Разработчики прописали людям с ограниченными возможностями то же поведение, что и остальным неигровым персонажам. Поэтому при столкновении с угрозой, на которую те не могут ответить, маломобильные, казалось бы, NPC просто бегут.
Скрипты в играх — участки кода, которые выполняются в ответ на определенные действия игрока. Кроме оптимизации и управления основными геймплейными элементами, скрипты часто отвечают за удержание игрока в сюжетном русле. Например, создают препятствия на пути, чтобы при движении по уровню игрок обнаружил и использовал конкретный маршрут. Скрипты часто содержат ошибки, и порой это помогает спидранерам проходить игру за считанные минуты. Скажем, рекорд по прохождению GTA: Vice City составляет 8 минут 28 секунд.
Парадоксально, но спустя много лет жизнь открытого мира в Cyberpunk 2077 проработана немногим лучше, чем в GTA. Огромное множество прохожих, как оказалось, просто ходят по карте кругами, заходя в тупик с помойкой, разворачиваясь и проходя тот же маршрут заново. Полицейские не будут реагировать, если вы начнете избивать прохожих. В Cyberpunk 2077 у автомобилей не простреливаются шины. Но возможно, в мрачном 2077 году все именно так и будет.
Хотите делать игры лучше?
Хотя игры становятся сложнее, создавать их сегодня проще, чем когда бы то ни было. Обширные документации к игровым консолям, мощные девкиты, доступные движки и теория — все это поможет избежать ошибок и расправиться с техническими ограничениями. Разработчикам сегодня гораздо проще, чем Стиву Джобсу и Стиву Возняку, которые исключали из логической схемы максимальное количество чипов при оптимизации арканоида Breakout.
Кстати, теперь создателю игры не нужен инвестор, который вложится в физические носители. Попробуйте вспомнить: когда вы в последний раз покупали диск с игрой? Успешные проекты создаются командами, состоящими из одного человека. Среди них: Papers, please, Stardew Valley, Her Story. Многие разработчики, вдохновленные упомянутой в этом тексте классикой, создают ретро-игры, использующие современные технологии, например, трассировку лучей.
Может быть, у вас есть идеи, которые могут всколыхнуть игровую индустрию, но вы не знаете, как воплотить их в жизнь? Индустрия стремительно развивается: согласно Global Games Market Report, объём игровой индустрии в 2023 году составит более $200 млрд. Ей требуются новые специалисты: разработчики, художники, геймдизайнеры, игровые аналитики. Выбирайте, что вам больше по душе, и осваивайте специальность. Превратите любовь к играм в востребованную профессию и выберите свой курс в Нетологии.
Богдан Сиротич
Непростой тест о человеческом общении
Сколько языков в среднем знает обычный человек? В большинстве случаев — только свой родной, чуть реже — два-три. Полиглот может похвастаться десятком, а какой-нибудь языковой вундеркинд — и парой десятков. Между тем в мире насчитывают тысячи языков и диалектов, включая исчезающие и вымершие. Но даже во вполне здравствующих языках несложно заблудиться. Попробуйте пройти наш тест, в котором нужно слушать, смотреть и читать на разных языках.