[Перевод] Векторные игры на 32с3

zp-cyklaliwaoss45dofhdukwuq.png

Статья раскрывает тему нашего выступления на 32-м Всемирном конгрессе хакеров (32с3), посвященного ретро-геймингу и работе с эмулятором игровых автоматов (MAME) на XY-дисплеях. В нем освещается результат моего сотрудничества с еще одним членом NYC Resistor, цифровым дизайнером Адель Лин, которая увлекается разработкой игр и игровых пространств. При желании можно посмотреть получасовое видео выступления онлайн.

История векторной графики


Аналоговые компьютеры


om4ykamcpfkug9p_untfk0zmnna.png

В самых ранних аналоговых компьютерах для вывода результатов вычислений использовались осциллографы или плоттеры. На фото выше EAI680 отображает на своем XY-мониторе Tektronix результат дифференциального уравнения, моделирующего демпфированный маятник.

yujvasqpc5eatn2ldtzhgqpx07e.gif

Первая видеоигра, Tennis for Two 1958 года, была разработана на похожем аналоговом компьютере и выводилась на осциллограф. Отскакивание мяча было реализовано с помощью другого дифференциального уравнения, очень похожего на приведенное в предыдущем примере.

mqitjryw7kxuegs0u3uagijv6s4.jpeg

В Tennis for two нет исходного кода, так как создавалась игра исключительно аппаратно. Здесь использовались реле для управления направлением мяча, блоки сравнения, которые обнаруживали касание мячом земли или сетки, операционные усилители, которые реализовывали дифференциальное уравнение, резисторы, имитировавшие притяжение и т.д.

180ti4z6df59zco0aq3-_ed7_dq.jpeg

Адель в сотрудничестве с продюсером Жаном Анджелом, студией игрового дизайна Sozen Eyes и физиком Питером Такачем работала над современной реконструкцией этого устройства для Silicon City. Ввиду необходимости поддержания работоспособности инсталляции без обслуживания на все время пятимесячной выставки в музее NYHC они использовали монитор 4К и эмулировали игру. Дело в том, что во время демонстрации Tennis for Two в Брукхэвене работал штат техников, которые заменяли выходившие из строя детали, чего в NYHC хотели избежать.

Цифровые компьютеры


ayupo2hfsuv1dr2m1-hurtids2o.jpeg

Spacewar! 1962 года стала одной из первых цифровых видеоигр, в которой на XY-дисплее компьютера PDP-1 отображались корабли игроков, их орудия, а также звездное поле. Управление осуществлялось с помощью рычагов и кнопок на передней панели системы, хотя зачастую во избежание их износа для этого собирались отдельные блоки управления.

-zwgk5gx59qpznpfb9hlo4hj4zk.png

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

Почему векторные игры?


В 1978 году, когда для игры Lunar Lander был разработан цифровой генератор векторов, память для фреймбуферов в видеоиграх обходилась очень дорого. Двум буферам размером 512×512х4 требовалось 128 запоминающих устройств общей стоимостью $614. — Джед Марголин, инженер Atari.

Именно поэтому во времена доминирования растровых дисплеев был смысл затратить все эти усилия, чтобы добиться отрисовки векторов. Стоимость создания растровой версии Asteroids с фреймбуфером, способным поддерживать разрешение экрана 1024×1024 составила бы тысячи долларов. Для этого также необходим дисплей, который справился бы с отрисовкой столь огромного количества вертикальных линий: большинство ЭЛТ же разрабатывались для телевидения, и обеспечивали разрешение всего в пару сотен тысяч линий.
pq30um6jkeze0v0cbprgxew2sqk.png

Star Wars на Acorn Electron

na0vmrlloyprbqg7we_lplok0_g.png
Star Wars на векторном дисплее

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

lsknwdowiqgyfzlxznu6q_vi1dw.gif

Star Wars на Atari 2600
jzl0aeajg4cmylhh3fsj2hwgaxw.gif

Star Wars на векторном дисплее

Помимо этого, векторы упрощают 3D-анимацию. Выше представлено сравнение растровой версии игры, пытающейся сымитировать трехмерный мир, с масштабированной и повернутой 3D моделью Tie-Fighter. В какой вариант вы бы предпочли сыграть?

Устройства генерации векторов


Как происходит отрисовка


qar8bjeoahi-dwjsvn5b4p2433g.png

В векторном дисплее луч не рисует горизонтальные «линии сканирования», как в условной ЭЛТ. Вместо этого он может быть направлен в произвольную область экрана для создания яркой точки в конкретном месте. В векторных дисплеях без запоминания яркость точки определяется продолжительностью направления на нее луча. Варьируя входы X и Y, можно рисовать линии или другие фигуры. С помощью быстрого перемещения или изменения яркости («Z») входного сигнала можно отображать прерывистые линии. В данном случае я отключил вход Z, чтобы можно было увидеть последовательность отрисовки объектов на экране. В показанной здесь игре Lunar Lander используется «цифровой генератор векторов», непосредственно управляющий лучом.

wrrksvi4yzsnrnpps9tlduvysvg.jpeg

В Tempest используется «аналоговая генерация векторов», при которой всегда происходит возвращение в середину, поскольку это единственная определенная точка. В обоих случаях особую сложность представляет генерация этих векторов — если система приостановится даже на пару наносекунд, произойдет существенное изменение яркости линии.

Аналоговая и цифровая генерация


При написании этого раздела я опирался на руководство Джеда Марголина по векторным дисплеям.

t6iubkuxvblr0ktpbo1ze50ad9u.png
Схема цифровой генерации векторов

fxsgyktjddsxbywtjy30nzvalc0.png
Схема аналоговой генерации векторов

Один из способов генерации векторов — это использование цифро-аналогового преобразователя (ЦАП), напрямую управляющего входами X и Y дисплея. Это и есть цифровой генератор векторов, который использовался в ранних играх вроде Asteroids и Lunar Lander. В нем задействовались 10-битные ЦАП и операционный усилитель, настроенный в качестве буфера, но при этом требовалось, чтобы ЦПУ большую часть времени выполнял обновление входных сигналов ЦАП, а разрешение ограничивалось до приблизительно 1024×768 точек.

Другая техника была разработана для более поздних игр вроде Starwars. В аналоговом генераторе векторов используется операционный усилитель, настроенный в качестве интегратора путем добавления конденсатора в контур обратной связи. Это означает, что на вход в ЦАП подается наклон линии, которую нужно сгенерировать, а аналоговая природа операционного усилителя обеспечивает отрисовку ее в «бесконечно» гладком виде.

ykx7dd5dfdaagzv5ptrx2wne8fi.png

На современном оборудовании можно легко генерировать 12-битные линии, которые намного превышают разрешение небольших векторных дисплеев. При этом можно также задействовать механизмы прямого доступа к памяти (ПДП) на микроконтроллерах, чтобы разгрузить процесс отправки данных в ЦАП. На картинке выше показанпрототип моей открытой для использования платы v.st. Ее можно без проблем собрать также на макетной плате для собственных экспериментов.

kotject8fc97wchwd10ufsmh0qm.png

И раз уж теперь нам доступны гораздо большие вычислительные мощности ЦПУ, чем во времена создания всех этих игр, я также пропатчил код генерации векторов для их упорядочивания с целью снизить общее время перемещения. Это дает большую разницу на векторных дисплеях с низкой пропускной способностью.

Аппаратная часть векторного дисплея


Осциллограф


faktggi_egpx3h6_agks_-nfjx8.jpeg

Современные цифровые осциллографы не очень хорошо подходят для отображения данных. Их ЖК-дисплеи могут эмулировать послесвечение, но обычно обладают всего лишь 8-битным АЦП и очень низким разрешением. Они по-прежнему сверхполезны для общего измерения сигнала, но не в интересующем нас случае.

fwfylutz9fhefwnl3xd5k7s3yay.jpeg

Вместо этого можно отправиться на eBay или craiglist и найти аналоговый ЭЛТ-осциллограф с режимом X-Y, который обойдется в районе $50 Подойдет любой вариант с шириной полосы в 5МГц и более — все равно ЦАПы на платах v.st могут выдавать частоту максимум 2МГц.

Запоминающие дисплеи


mjqvwm8yu8pmmujhfyngbuy6mcg.gif

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

Вектороскоп


r9bjykaabgsk7ivkym2ogr_w8fq.jpeg

Вектороскопы, такие как Tek 1720, использовались в телевизионных станциях для калибровки цветовых полос, и по мере перехода станций в цифровой режим их применение постепенно прекращалось. В результате таких аналоговых дисплеев на eBay предлагается очень много и за небольшие деньги. Они используют очень быстрое электростатическое отклонение и оснащены, как правило, небольшими, но очень резкими экранами. Эти дисплеи также оборудованы дифференциальными входами, что избавляет от необходимости использовать отрицательный выход на ЦАП.

Консоли Vectrex


ha0cj0iqpfkae3f0zeogmnbu1o0.jpeg
Консоль Vectrex

njuvgzgakkwnzrrja3fqtpilwpk.jpeg
Электроника Vectrex

Домашняя игровая консоль Vectrex оборудована приятным черно-белым экраном с высокой резкостью. Можно без проблем отсоединить материнскую плату от аналогового драйвера ЭЛТ и вывести провода из корпуса для подключения платы v.st.

ju1sbn6w9famltotjg1cbikkwdq.jpeg

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

Лазерные проекторы


_-dpsvvea1j-hbeqk7ocjv4ncto.jpeg

Также можно использовать лазерный проектор, вот только результат получится не лучшего качества. Физические зеркала обладают определенной долей инерции, и на включение/выключение луча требуется время. В результате частота обновления падает, и изображение получается мерцающим. Некоторые специализированные игры могут работать с очень быстрыми (45–60 Kpps) гальваническими сканерами, но почти все аркады требуют отображения слишком большого количества векторов.

uj5bus22mkgunjenvceacjuqg0i.gif

Проект LazyMame добился неплохих успехов, но я не могу найти никаких подробностей или исходного кода уже с 2008 года. Позже в 2013 возник проект OpenLase-Mame, который с тех пор молчит. Помимо этого, другие разработчики пробовали создавать новые лазерные игры с помощью кастомного плагина Unity. Некоторые преуспели.

MAME


bonfsb9uovxs2c7lyerqhccvyyy.png
MAME — это акроним от Multiple Arcade Machine Emulator, означающего эмулятор множества аркадных автоматов, и его имя себя вполне оправдывает — он способен эмулировать тысячи игр и автоматов, включая практически все когда-либо созданные векторные аркады.

Эмуляция векторных дисплеев


ubpkfoaxx4d7lhnkreg1h0zarbm.png
Фактическое свечение на векторном дисплее

z0-fgf5jrwr-e6h4xnmx96ym_gu.png
Эмулированное векторное свечение

Эффект «свечения», создаваемый яркими векторными линиями, относится к одной из излюбленных игроками особенностей. В MAME есть поддержка шейдеров HLSL, которые размывают яркие линии и создают подобие этого эффекта. Сверху изображен реальный дисплей
Vectrex, а снизу эмуляция на MAME.

Патчи для подключения к дисплею


wszcpei916glb-6txms2hplkuns.png

К сожалению, мой патч для MAME, который добавлял поддержку экспорта векторов, был закрыт как «неприемлемо «грязный» способ достижения желаемого результата». Так что вам потребуется клонировать мое дерево и следовать инструкциям по созданию векторного MAME. Основная часть изменений находится в src/emu/video/vector.cpp и опирается на усекаемые окна, которые MAME использует для ограничения векторов областью экрана.

Патчи для Raspberry Pi


xb_q021hibkoefioczkcc90b_6s.jpeg

Я также портировал изменения в голую сборку MAME4AllPi для Raspberry Pi. Инструкции для векторного MAME на Pi аналогичны. Нужно будет клонировать дерево и вшить его в Pi. К сожалению, здесь имеется ряд проблем с джойстиком, которые еще предстоит исправить.

Играем


u9aoas8f3xyyghjcwoaefkypchk.png
Вы можете поиграть в одну из оригинальных игр, Space Wars, вышедшую в 1977 году

2ornzolmlb3hssqfwpx4dqb2q_c.png
Asteroids (1979) тоже всегда славилась популярностью и была одной из самых кассовых игр своего времени!

nxumgb0ftlxggfavfdwbioa0jss.png
Lunar Lander на вектороскопе

hbbkc9ktyq1byoiwifq3ar3tlaa.gif

Tempest на вектороскопе

Или, быть может, вам больше по душе придутся Lunar Lander (1979) и Tempest (1980).

lid731xfw1g2s_p9yoo7jyd6pii.png
Сэмулировать можно огромное число векторных игр, включая весь список Atari

hl1g2x5mupmlsxez-uuizzqlszo.png
Так много малоизвестных игр, что все и не перечислишь, но я собрал список проектов Vectrex, включив в него также векторные аркады, упомянутые в Википедии

Кастомизация


Пользовательские устройства ввода


001cnb5yddglnrarphlu4wqotae.jpeg
Консоль Robotron собственной сборки

s9nc-hufjjxxrepjtryfgap0_tm.jpeg
Robotron

Как только вы подключите векторный дисплей к MAME, вам наверняка захочется внести свои доработки. Можно без проблем собрать собственные USB HID-устройства на основе предлагаемых Adafruit аркадных джойстиков, кнопок и даже монетоприемников.

Примечание ред.: доступ к ресурсу Adafruit возможен только через VPN.

Креативное программирование с векторами


dgbn9ewdr1trvh5pe5uiochr-ou.jpeg

Если же вы устали от игр, то всегда можно превратить дисплей в вектороскопические часы. В Teensy 3 есть сквозные отверстия для кварцевого резонатора 32.768КГц и резервная батарея, позволяющая поддерживать точность отображаемого времени.

boxgl86obk5dhlgfya_e5qu27qe.gif

Можно писать игры, которые будут выполняться непосредственно на Teensy, как мой клон Asteroids, Space Rocks, или создавать какие-нибудь арт-проекты.

ufaexz2kc-mibt9ta2de0hniwqc.jpeg
Некоторые энтузиасты реализуют поистине грандиозные проекты — vec9 стал первой векторной аркадой за тридцать лет, реализованной в кастомном автомате с рычагом управления, как в реальном танке.

twselgnjifhm7iz3h_k2lyspyy8.gif
mq1d_tpkekgoeggggl-ylfflv_0.gif

Мы создали простую библиотеку на Processing, чтобы показать, как пишутся программы, взаимодействующие с такими дисплеями. Образец кода лежит в репозитории, а также портирован на ProcessingJS в виде демо-заставок Swarm и Random Walk.

uecdaepnietivvz5kew4e5gtiba.png
Дополнительную информацию по платам можно найти на MAME, Vectrex и Tek 1720.

aj5fkoo2yg6aswdf1q_onnpkmke.gif

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru