Почему разработчики любят запускать Doom на разном железе

Пер­вая вер­сия Doom появи­лась, страш­но ска­зать, в 1993 году. Тогда она рабо­та­ла толь­ко на ПК. Через год в неё мож­но было играть на любой при­став­ке, а потом её ста­ли запус­кать вез­де, где есть хоть какой-то экран и про­цес­сор. Раз­ра­бот­чи­ки и про­грам­ми­сты про­сто раз­вле­ка­ют­ся тем, что запус­ка­ют Doom на том желе­зе, где не пред­по­ла­га­лось ника­ких игр: на фото­ап­па­ра­тах, реклам­ных щитах, аппа­ра­тах УЗИ, холо­диль­ни­ках и бензопилах.

На то есть при­чи­на. Для сво­е­го вре­ме­ни Doom была тех­но­ло­ги­че­ским чудом: с инже­нер­ной точ­ки зре­ния это очень умно сде­лан­ная игра, в ней при­ме­ня­ют­ся нево­об­ра­зи­мые для совре­мен­но­го про­грам­ми­ста опти­ми­за­ции, и всё ради того, что­бы обой­ти огра­ни­че­ния древ­не­го ком­пью­тер­но­го железа.

Запу­стить Doom на чём-то сего­дня — это как взо­брать­ся на Эве­рест. В целом низа­чем не нуж­но, но очень почёт­но и интересно.

Размер


Вся игра — на четы­рёх дискетах. 

Игры, подоб­ные Doom, обыч­но зани­ма­ли 15–20 мега­байт, но раз­ра­бот­чи­ки из id Software смог­ли уме­стить её в 4 мега­бай­та. Сюда входят:

  • все уров­ни и текстуры,
  • зву­ки,
  • вра­ги,
  • их логи­ка и поведение,
  • ору­жие,
  • воз­мож­ность играть по сети!

Если вам инте­рес­но, как это мог­ло быть сде­ла­но, почи­тай­те наш раз­бор о том, как пишут подоб­ные игры.

Бла­го­да­ря раз­ме­ру в 4 МБ Doom мож­но запи­сать почти на любой ком­пью­тер. Напом­ним, это было вре­мя, когда у людей были жёст­кие дис­ки по 100–500 МБ.

Ненастоящее 3D

До Doom игры по боль­шей части были дву­мер­ны­ми по сути и смыс­лу: ты пры­гал с плат­фор­мы на плат­фор­му, ходил по плос­ко­сти вправо-влево. Мог­ла быть какая-то ими­та­ция глу­би­ны, как в каких-нибудь вин­таж­ных «Черепашках-ниндзя», но всё рав­но ощу­щал­ся плос­кий мир. Были, конеч­но, и трёх­мер­ные игры, но выгля­де­ли они…

Doom впер­вые замах­нул­ся на то, что сей­час бы назва­ли «иммер­сив­ным 3D-шутером». Была цель сде­лать игру, в кото­рую ты погру­жён от пер­во­го лица, и при этом что­бы она была очень быст­рой по гейм­плею. Нуж­на была нор­маль­ная трёх­мер­ная графика.

Но на Пен­ти­умах тех лет трёх­мер­ная гра­фи­ка страш­но тор­мо­зи­ла. Её мож­но было рисо­вать в режи­ме слайд-шоу, но на дина­мич­ный экшен мощ­но­сти не хватало.

Отсю­да пер­вая кру­тей­шая опти­ми­за­ция трёх­мер­ной гра­фи­ки в Doom: это не трёх­мер­ная гра­фи­ка. Здесь нет высо­ты. Вы види­те высо­ту на экране, но это все­го лишь хит­рая про­грам­мист­ская опти­ми­за­ция. Глав­ный герой может смот­реть толь­ко вправо-влево, но у него нет дви­же­ния вверх-вниз. Все объ­ек­ты в Doom нахо­дят­ся на одном уровне с глав­ным героем.

Вы заме­ти­те, что глав­ный герой при ходь­бе как бы кача­ет­ся вверх-вниз. При этом его точ­ка зре­ния все­гда ров­но по цен­тру, взгляд героя все­гда устрем­лён в горизонт.

Для при­ме­ра, срав­ни­те это с уже под­лин­но трёх­мер­ной игрой Quake, кото­рая вышла тре­мя года­ми позд­нее. Тут уже и каме­ра смот­рит во всех направ­ле­ни­ях, и вра­ги — это трёх­мер­ные модели:

Для ком­пью­те­ра это псевдо-3D зна­чит, что не нуж­но счи­тать иска­же­ния от дви­же­ния каме­ры вверх. Доста­точ­но про­сто счи­тать пер­спек­тив­ные иска­же­ния стен и пола, при­ме­няя менее ресур­со­ём­кую математику.

На экране это почти неза­мет­но: бла­го­да­ря све­ту, тональ­ной пер­спек­ти­ве и тек­сту­рам игро­ку кажет­ся, что всё по-настоящему трёх­мер­но. Но в игре у глав­но­го героя не полу­ча­ет­ся прой­ти под лета­ю­щи­ми мон­стра­ми или про­лезть под препятствием.

Но постой­те: а как же лест­ни­цы? А шут­ка в том, что сту­пень­ки, кубы и про­чие высту­пы — это фак­ти­че­ски отдель­ные ком­на­ты со сво­ей высо­той пола, но без стен. Всё, что внут­ри этой ком­на­ты, рас­по­ла­га­ет­ся на одной высо­те, поэто­му когда герой заби­ра­ет­ся на сту­пень­ку, по фак­ту он про­сто попа­да­ет в дру­гую ком­на­ту, где всё сно­ва ста­но­вит­ся с ним одной высоты.

К чему это приводит:

  • Все уров­ни плос­кие. В Doom не быва­ет «ком­на­ты над комнатой».
  • Уров­ни раз­би­ты на сек­то­ры: внут­ри каж­до­го сек­то­ра оди­на­ко­вая высо­та стен и оди­на­ко­вое осве­ще­ние. Что­бы сме­нить осве­ще­ние или общее настро­е­ние уров­ня, нуж­но хит­рым обра­зом пере­ки­нуть игро­ка в новый сектор.
  • Вра­ги и пред­ме­ты — это плос­кие «спрай­ты», то есть про­сто кар­тин­ки, кото­рые рису­ют­ся поверх ваше­го экрана.
  • Бла­го­да­ря кон­струк­ции стен и кори­до­ров полу­чи­лось создать очень эко­но­мич­ный дви­жок рен­де­рин­га: он рису­ет толь­ко те пик­се­ли, на кото­рые игрок смот­рит пря­мо сей­час. Мощ­ность про­цес­со­ра не тра­тит­ся на объ­ек­ты, кото­рые сей­час вне поля зре­ния игрока.

С — совместимость

Почти весь дви­жок Doom напи­сан на C, а это зна­чит, что его мож­но пор­ти­ро­вать и пере­ком­пи­ли­ро­вать для дру­гих плат­форм. Шту­ка в том, что C — очень гиб­кий и мощ­ный язык, кото­рый не зави­сит от плат­фор­мы, глав­ное, что­бы был нуж­ный компилятор.

Но оста­ва­лась ещё та часть, кото­рая в ори­ги­наль­ной игре была напи­са­на на ассем­бле­ре, и при пере­но­се с ней мог­ли быть про­бле­мы, так как ассем­блер зави­сит от кон­крет­но­го про­цес­со­ра. Всё реши­лось, когда раз­ра­бот­чи­ки пере­но­си­ли игру на при­став­ки Nintendo и заме­ни­ли эти фраг­мен­ты кодом на C.

После это­го Doom мож­но было пор­ти­ро­вать на что угод­но, если для это­го желе­за есть C-компилятор.

Автоматическая оптимизация на слабом железе

У движ­ка Doom есть класс­ная осо­бен­ность: он сам опре­де­ля­ет мощ­ность про­цес­со­ра и воз­мож­но­сти мони­то­ра, что­бы гра­фи­ка рабо­та­ла быст­ро даже на сла­бых машинах.

Устро­е­но это так: если про­цес­сор сла­бый, то тек­сту­ры упро­ща­ют­ся в два раза, если совсем сла­бы — в четы­ре раза. Каж­дая тек­сту­ра накла­ды­ва­ет­ся на одну сто­ро­ну вир­ту­аль­но­го куба, у кото­рой есть дли­на и шири­на. Так как тек­сту­ры упро­ща­ют­ся в два раза по каж­до­му изме­ре­нию, полу­ча­ет­ся, что на одну сто­ро­ну тра­тит­ся в 2 × 2 = 4 раза мень­ше ресур­сов, а на весь куб — в 24 раза меньше.

С мони­то­ром то же самое: если он может отоб­ра­жать толь­ко 8 цве­тов, то про­цес­сор не будет вычис­лять оттен­ки крас­но­го, напри­мер. Вме­сто это­го он всю палит­ру при­ве­дёт к цве­там мони­то­ра и будет рабо­тать с ними, что даст суще­ствен­ный при­рост производительности.

Сюжет и драматургия

В Doom были и гейм­ди­зай­нер­ские новшества:

  • Не нуж­но было читать всту­пи­тель­ный текст (его назы­ва­ют игро­вым лором) — игра рас­ска­зы­ва­ла свою исто­рию по мере прохождения.
  • Это была одна из пер­вых игр с таким уров­нем кро­ви, таким коли­че­ством взры­вов, яро­сти и жесто­ко­сти. Сей­час мы, конеч­но, при­вык­ли, но тогда это было све­жо и ново.
  • Doom открыл пор­тал в муль­ти­пле­ер: поми­мо сюжет­ной части мож­но было устра­и­вать тур­ни­ры по сети.
  • Бри­тый кос­мо­де­сант­ник, дро­бо­вик, бен­зо­пи­ла и пуле­мёт — до Doom у нас это­го не было.

И такой момент: пер­вые уров­ни Doom пока­за­ли бес­плат­но в 1992 году, а потом уже в 1993 выпу­сти­ли пол­ную плат­ную вер­сию. Есте­ствен­но, все её дико захо­те­ли. Free-to-play родил­ся где-то вме­сте с Doom.

Вели­кая игра, что гово­рить. Даже сей­час игра­ет­ся на ура. Спа­си­бо тебе, Doom, за наше счаст­ли­вое детство.