Gamedev
Andrey Apanasik
4720

Полигоны Another World

В закладки
Слушать

Существует интересный способ изучения архитектуры компьютеров прошлого. Найти знакомую вам программу и попытаться выяснить, как она была портирована.

Хорошим выбором для этого мог бы стать DOOM. Мегахит 1994 года от id Software был портирован на всё, что только можно. Игра спроектирована вокруг ядра, чётко разделённого на слои. Обычно легко найти и прочитать реализацию шести подсистем ввода-вывода.

Другим выбором могла бы стать Another World 1991 года от Эрика Шайи, в Северной Америке более известная под именем Out Of This World. Я бы сказал, что на самом деле её интереснее изучать, чем DOOM, из-за полигональной графики, подходящей для диких оптимизаций. В некоторых случаях хитрые трюки позволяли игре работать на оборудовании, созданном за пять лет до выхода игры.

Серия статей

Эта серия статей представляет собой путешествие по оборудованию для видеоигр начала 90-х. От Amiga 500, Atari ST, IBM PC, Super Nintendo, до Sega Genesis. Для каждой машины я пытался узнать, как реализована Another World.

В лучшем случае мне удалось связаться с оригинальным разработчиком. В худших мне приходилось самому разбираться в дизассемблированном коде. Это было весёлое приключение.

Another World 101

В Another World довольно мало кода. В первоначальной версии для Amiga, как сообщалось, было всего 6000 строк. Исполняемый файл для DOS под PC составляет всего 20 кБ. Удивительно для такой огромной игры, которая поставлялась на одной дискете 1.44 MiB. Всё потому, что большая часть бизнес-логики реализована с помощью байт-кода. Исполняемый файл Another World фактически является хостом виртуальной машины, читающим и выполняющим uint8_t опкоды.

Виртуальная машина в Another World определяет 256 переменных, 64 потока, 29 опкодов и три фреймбуфера. Вот и всё. Если вы создадите хост для виртуальной машины, способный справиться с этим, вы сможете запустить игру. Если вы можете сделать виртуальную машину достаточно быстрой, чтобы работать со скоростью 20 кадров в секунду, вы в действительности сможете сыграть в игру.

Графическая система виртуальной машины использует систему координат 320×200 с 16-цветовой палитрой. Ограничение на палитру может удивить, учитывая, что Amiga 500 поддерживает до 32 цветов. Это было сделано целенаправленно, что позволило совместить графику с другой крупной платформой того времени — Atari ST, которая поддерживает только 16 цветов.

Но нет худа без добра. Это ограничение привело к уникальному стилю, который и по прошествии лет всё также радует взгляд.

Даже когда была возможность использовать определённую палитру для сцены, Эрик Шайи решил не делать этого. Во время столкновения с «Чудовищем» для оного используются всего три цвета: черный для тела, красный для глаз и бежевый для зубов. Воображение сделало остальное.

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

Движок также способен создавать эффекты полупрозрачности, если на сцене только восемь цветов.

Здесь цвета хранятся в пределах [0x0,0x8].

Лучи от фар Ferrari полупрозрачны. Они нарисованы специальным цветом 0x10, которго не существует, поскольку доступно только 16 цветов. Специальное значение интерпретируется как «прочитать индекс кадрового буфера, добавить 0x8 и вернуть». Последняя часть трюка заключается в умном выборе следующих 8 цветов в палитре.

Прозрачность использовалась в игре не так часто, но её можно увидеть ещё раз во время эксперимента, когда молния вот-вот телепортирует Лестера в Другой Мир.

Три фреймбуфера

Из трёх фреймбуферов два используются для двойной буферизации, в то время как последний используется для сохранения фоновой (BKGD) композиции. Эта оптимизация позволяет избежать перерисовки всех полигонов статических фонов в пользу простой операции копирования.

В следующем видео посмотрите, как новая сцена рисуется сначала в BKGD буфере. Каждый новый кадр BKGD полностью копируется в двойной буфер. Там движущиеся элементы, такие как Лестер, отрисовываются. Обратите внимание, что после того, как автомобиль «припаркован», он также рисуется в BKGD буфере, чтобы минимизировать количество полигонов, которые будут отрисованы в последующих кадрах.

Также обратите внимание, как в композиции используется простой алгоритм художника, который, не смотря на свою простоту, приводит к лишней перерисовке. Это не проблема, поскольку она в значительной степени амортизируется копией BKGD.

Опкоды виртуальной машины

В следующей таблице представлено 29 опкодов. Здесь можно найти опкоды по управлению потоками (THRD), управлению фреймбуферами (FB) и все операции управления регистрами. Большинство операций «просты» в реализации, за исключением «COPY FB», «FILL» и «DRAW_POLY*», которые сложны в плане производительности.

Оба DRAW_POLY_* опкода охватывают более одной ячеки. DRAW_POLY_BACKGROUND занимает половину пространства опкодов — от 0x80 до 0xFF. Весьма расточительно, но это уловка для экономии места. Использование всех операций, начинающихся с бита «1», позволяет 7 другим битам переноситься в пространство опкодов в качестве параметров отрисовки. Поскольку этот опкод используется для фона и синиматиков, экономия места очень важна.

SPRITE версия использует все опкоды, начинающиеся с битов «01», в то время как остальные оставшиеся 6 битов предназначены для кодирования [x, y] координат и зума для отрисовки «спрайтов» Лестера, друга и врагов.

Что дальше?

Как упоминалось ранее, 26 из 29 опкодов легко реализовать. Реальная проблема при портировании этой игры заключалась в манипулировании пикселями в пределах ограничений шины и пропускной способности процессора. В этой серии будет рассмотрено, как при порте происходила манипуляция фреймбуферами и как решались проблемы DRAW, FILL и COPY опкодов.

Пишу про /gamedev (/unity и /gamedevnews) и индустрию. Поддержать всегда можно на Патреоне. Всем добра (ノ◕ヮ◕)ノ*:・゚✧ Где ещё можно меня найти:- Бложик.- Дзен.- Твиттер.- Хабр.
{ "author_name": "Andrey Apanasik", "author_type": "self", "tags": ["\u0440\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433","\u043f\u0430\u043b\u0438\u0442\u0440\u0430","outofthisworld","anotherworld"], "comments": 44, "likes": 155, "favorites": 189, "is_advertisement": false, "subsite_label": "gamedev", "id": 91408, "is_wide": false, "is_ugc": true, "date": "Sun, 05 Jan 2020 13:26:23 +0300", "is_special": false }
0
44 комментария
Популярные
По порядку
Написать комментарий...
38

Что делает это на моем порносайте?

P.S. А если серьезно - большое спасибо за статью)

Ответить
17

Это особый уровень порно. Без этих ваших

баб

Ответить

Откровенный кавалер

Darkusoid
31
Ответить
2

потратил 3 года в колледже чтобы уметь читать эту хуйню

Ответить
3

И что на картинке? Просто рандомные значки или ради рофла запилили реальную схему какой-нибудь мультиварки-пельменницы?

Ответить
2

Бредовая херь какая-то...  Что-то вроде платы из FM передатчика, но ничерта не правильно на схеме. Куча пропущенных деталей.

Ответить
6

Вообщем плохая робо-девочка. И на ней много чего нет)

Ответить
0

нет конечно 

Ответить
0

В одной из серий Футурама Бендер нашёл порно журнал для роботов, увидел эту фотку и сказал «плохая девочка»

Ответить
0

Спасибо, капитан очевидность, но это не ответ на мой вопрос

Ответить
15

Там в цикле ещё несколько статей. Надеюсь, найду время перевести.

Ответить
8

Спасибо за статью! А Another World - очередной отличный памятник техническому безумству (в хорошем смысле).

Ответить
1

Кажется в game.exe когда-то читал как id оптимизировали wolf на тогдашние машины, тоже довольно занимательная статья была...

Ответить

Откровенный кавалер

MriN
14

Раньше вообще в игрожуре много годной инфы давали. В УЧУ по полочкам разбирали третью кваку, поясняли как работает система клиент-сервер, что такое шейдеры, и .т.д. В мании было много материала по моддингу, начиная от первой HL, и заканчивая сталкером. А сейчас везде только мемасы и переводы скандалов-интриг-расследований.

Ответить
4

А сейчас везде только мемасы и переводы скандалов-интриг-расследований.

Раньше за хорошими статьями я на Хабр заходил, так теперь и там большинство популярных статей - эмиграция, шуточки, мемы, политика, исповеди алкоголиков и психбольных, в общем скучная, ничем не примечательная бытовуха. Хороших технических статей мало. Хотя некоторые темы еще радуют, например музей DataArt, делающий обзоры на раритетные устройства и берущий интервью у людей, стоявших у истоков вычислительной техники.

Сейчас никому не интересно, как работают игровые технологии на "низком" уровне, а у людей в индустрии не хватает таланта и что важнее - нет желания объяснять то, как они работают.

Ответить

Откровенный кавалер

Cino
5

Сто лет не был на хабре, сейчас решил зайти. Первая же статья, которую увидел -

 
"Пропаганда тоталитарного режима, антисемитизм и гомофобия в учебнике по программированию 2019 года? — Это возможно".

закрыл нахуй.

Ответить
2

Есть такое. Там нынче нужно на конкретных людей подписываться, чтоб только их посты читать и не видеть остального мусора.

Ответить
0

Бля, да хабр всегда таким был. Если посмотрите на начало 10-ых годов, то там что ни статья - то заметка. Сейчас наоборот качество статей выросло, хоть они и стали более укзопрофильными. Огромное количество интереснейших статей и сейчас выходит, альтернатив всё равно нет.

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

Ответить
1

а у людей в индустрии не хватает таланта и что важнее - нет желания объяснять то, как они работают

Ну нет. Просто на примере того же хабра - людей становится больше, "средняя температура по палате" падает, хабр становится неинтересен тем, кто писал интересные статьи, они его не читают, следовательно - не пишут.

На DTF, вроде, то же самое

Ответить
0

О, недавно изучал как работает движок Wolf3D. Даже сообразил пре пре пре пре альфа версию. Но вся инфа правда была разбросана по каким-то левым сайтам. На хабре вроде даже ни одной статьи не нашёл.

Ответить
1

Это скриншот из версии для Adobe Flash. Кто-то определенно знает толк в извращениях.

Ответить
2

Ладно Flash. Смешно, но моя первая версия - в Microsoft Excel. Очень сырая альфа, так сказать:) Она не умеет отображать текстуры, ходить можно по клеткам, и поворачиваться нельзя, но основную функцию оно исполняет - собственно рендерит лабиринт.

Ответить
3

я с закрытия УЧУ не читал журналов на игровую тематику. Только может диски попадались с демками...

Ответить
4

Блестящая работа, почитаю на досуге. Пили ещё :)

Ответить
4

Очень крутая статья, спасибо!

Ответить
4

Ничего не понятно, но интересно

Ответить
4

Ничего не понятно, но оооочень интересно

Ответить

Необходимый самолет

–1

На хабре опубликовано на 4 минуты раньше. Вы автор перевода или скопипастили?

https://habr.com/ru/post/482872/

Ответить
3

Ничего не понял, но зато интересно! Давай ещё)

Ответить
3

Уррра дтф вернулся....

Ответить
2

Побольше бы подобных статей, всегда интересно, не напригаясь самому, узнать как оно работает.

Ответить
1

Почитай хабр, там такого навалом. Мне лично нравятся статьи о думе 2016, занятное чтиво

Ответить
2

Я этот шедевр никак не мог поиграть на Сеге: просматривал ролик, какой-то всплеск под водой и появляется ввод пароля. Думал, игра бракованная, но через некоторое время находил новые картриджы и они тоже были такими.

В итоге, не помню как, но нажатие вверх двигало персонажа и он всплывал из бассейна!
Т.е. у игры реальная проблеме геймдиза - отсутствие какого-то обозначения момента, когда игроку даётся управление персонажем. Глянул переиздания - этого тоже нет!
Ну раз на DTF бывают геймдизы, то вот как это можно решить?
Думаю, надо давать уже в этом ролике интерактивные моменты, например, ввести код на двери, сесть в кресло...

Ответить
0

Т.е.в  момент, когда на экране все остановилось, вы не додумались понажимать кнопки?.. 

Ответить
0

В какой момент "на экране все остановилось"?

Ответить
1

"отсутствие какого-то обозначения момента, когда игроку даётся управление персонажем."

Ну т.е. наступал момент, в котором ГГ оказывается под водой и медленно идет ко дну, после чего он тонул и наступал конец игры. Собственно, в голову ни разу не пришло попробовать нажимать кнопки во время сцены под водой? 

Ответить
1

Там же только работает только одна кнопка, не? Т.е. пробуешь нажимать всё, и та самая кнопка нажимается только мельком, отчего персонаж только дрыгнет елезаметно.

Ответить
1

А. тогда да, лажа.

Ответить
2

Всё это, конечно, очень познавательно, но только...

алгоритм художника

Кто же, интересно, додумался назвать этот алгоритм именно так? Потому что настоящие художники никогда так не рисуют

Ответить
1

Спасибо! Очень круто

Ответить

Комментарии

{ "jsPath": "/static/build/dtf.ru/specials/DeliveryCheats/js/all.min.js?v=05.02.2020", "cssPath": "/static/build/dtf.ru/specials/DeliveryCheats/styles/all.min.css?v=05.02.2020", "fontsPath": "https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,700i&subset=cyrillic" }
{"hash":"edecc045","params":{"id":"dtfru","service":1,"title":"\u041f\u0440\u044f\u043c\u043e\u0439 \u044d\u0444\u0438\u0440","isLegacy":false}}