Статья раскрывает тему нашего выступления на 32-м Всемирном конгрессе хакеров (32с3), посвященного ретро-геймингу и работе с эмулятором игровых автоматов (MAME) на XY-дисплеях. В нем освещается результат моего сотрудничества с еще одним членом NYC Resistor, цифровым дизайнером Адель Лин, которая увлекается разработкой игр и игровых пространств. При желании можно посмотреть получасовое видео выступления онлайн.
История векторной графики
Аналоговые компьютеры
В самых ранних аналоговых компьютерах для вывода результатов вычислений использовались осциллографы или плоттеры. На фото выше EAI680 отображает на своем XY-мониторе Tektronix результат дифференциального уравнения, моделирующего демпфированный маятник.
Первая видеоигра, Tennis for Two 1958 года, была разработана на похожем аналоговом компьютере и выводилась на осциллограф. Отскакивание мяча было реализовано с помощью другого дифференциального уравнения, очень похожего на приведенное в предыдущем примере.
В Tennis for two нет исходного кода, так как создавалась игра исключительно аппаратно. Здесь использовались реле для управления направлением мяча, блоки сравнения, которые обнаруживали касание мячом земли или сетки, операционные усилители, которые реализовывали дифференциальное уравнение, резисторы, имитировавшие притяжение и т.д.
Адель в сотрудничестве с продюсером Жаном Анджелом, студией игрового дизайна Sozen Eyes и физиком Питером Такачем работала над современной реконструкцией этого устройства для Silicon City. Ввиду необходимости поддержания работоспособности инсталляции без обслуживания на все время пятимесячной выставки в музее NYHC они использовали монитор 4К и эмулировали игру. Дело в том, что во время демонстрации Tennis for Two в Брукхэвене работал штат техников, которые заменяли выходившие из строя детали, чего в NYHC хотели избежать.
Цифровые компьютеры
Spacewar! 1962 года стала одной из первых цифровых видеоигр, в которой на XY-дисплее компьютера PDP-1 отображались корабли игроков, их орудия, а также звездное поле. Управление осуществлялось с помощью рычагов и кнопок на передней панели системы, хотя зачастую во избежание их износа для этого собирались отдельные блоки управления.
Векторные дисплеи на запоминающей трубке широко применялись в различных устройствах, так как могли отрисовывать высокоточные линии и поддерживать стабильное изображение. Впрочем, для игр они не особо подходили, хотя позволяли компьютерам с малым объемом памяти рисовать невероятно сложные картинки по каналам с низкой пропускной способностью.
Почему векторные игры?
В 1978 году, когда для игры Lunar Lander был разработан цифровой генератор векторов, память для фреймбуферов в видеоиграх обходилась очень дорого. Двум буферам размером 512х512х4 требовалось 128 запоминающих устройств общей стоимостью $614. — Джед Марголин, инженер Atari.
Именно поэтому во времена доминирования растровых дисплеев был смысл затратить все эти усилия, чтобы добиться отрисовки векторов. Стоимость создания растровой версии Asteroids с фреймбуфером, способным поддерживать разрешение экрана 1024х1024 составила бы тысячи долларов. Для этого также необходим дисплей, который справился бы с отрисовкой столь огромного количества вертикальных линий: большинство ЭЛТ же разрабатывались для телевидения, и обеспечивали разрешение всего в пару сотен тысяч линий.
Star Wars на Acorn Electron
Star Wars на векторном дисплее
Сравните угловатое пиксельное растровое изображение Starwars с его векторной версией. Поистине завораживает, насколько больше деталей векторные линии могут демонстрировать, и как четко они представляют круг звезды смерти.
Star Wars на Atari 2600
Star Wars на векторном дисплее
Помимо этого, векторы упрощают 3D-анимацию. Выше представлено сравнение растровой версии игры, пытающейся сымитировать трехмерный мир, с масштабированной и повернутой 3D моделью Tie-Fighter. В какой вариант вы бы предпочли сыграть?
Устройства генерации векторов
Как происходит отрисовка
В векторном дисплее луч не рисует горизонтальные «линии сканирования», как в условной ЭЛТ. Вместо этого он может быть направлен в произвольную область экрана для создания яркой точки в конкретном месте. В векторных дисплеях без запоминания яркость точки определяется продолжительностью направления на нее луча. Варьируя входы X и Y, можно рисовать линии или другие фигуры. С помощью быстрого перемещения или изменения яркости (“Z”) входного сигнала можно отображать прерывистые линии. В данном случае я отключил вход Z, чтобы можно было увидеть последовательность отрисовки объектов на экране. В показанной здесь игре Lunar Lander используется «цифровой генератор векторов», непосредственно управляющий лучом.
В Tempest используется «аналоговая генерация векторов», при которой всегда происходит возвращение в середину, поскольку это единственная определенная точка. В обоих случаях особую сложность представляет генерация этих векторов – если система приостановится даже на пару наносекунд, произойдет существенное изменение яркости линии.
Аналоговая и цифровая генерация
При написании этого раздела я опирался на руководство Джеда Марголина по векторным дисплеям.
Схема цифровой генерации векторов
Схема аналоговой генерации векторов
Один из способов генерации векторов – это использование цифро-аналогового преобразователя (ЦАП), напрямую управляющего входами X и Y дисплея. Это и есть цифровой генератор векторов, который использовался в ранних играх вроде Asteroids и Lunar Lander. В нем задействовались 10-битные ЦАП и операционный усилитель, настроенный в качестве буфера, но при этом требовалось, чтобы ЦПУ большую часть времени выполнял обновление входных сигналов ЦАП, а разрешение ограничивалось до приблизительно 1024х768 точек.
Другая техника была разработана для более поздних игр вроде Starwars. В аналоговом генераторе векторов используется операционный усилитель, настроенный в качестве интегратора путем добавления конденсатора в контур обратной связи. Это означает, что на вход в ЦАП подается наклон линии, которую нужно сгенерировать, а аналоговая природа операционного усилителя обеспечивает отрисовку ее в «бесконечно» гладком виде.
На современном оборудовании можно легко генерировать 12-битные линии, которые намного превышают разрешение небольших векторных дисплеев. При этом можно также задействовать механизмы прямого доступа к памяти (ПДП) на микроконтроллерах, чтобы разгрузить процесс отправки данных в ЦАП. На картинке выше показанпрототип моей открытой для использования платы v.st. Ее можно без проблем собрать также на макетной плате для собственных экспериментов.
И раз уж теперь нам доступны гораздо большие вычислительные мощности ЦПУ, чем во времена создания всех этих игр, я также пропатчил код генерации векторов для их упорядочивания с целью снизить общее время перемещения. Это дает большую разницу на векторных дисплеях с низкой пропускной способностью.
Аппаратная часть векторного дисплея
Осциллограф
Современные цифровые осциллографы не очень хорошо подходят для отображения данных. Их ЖК-дисплеи могут эмулировать послесвечение, но обычно обладают всего лишь 8-битным АЦП и очень низким разрешением. Они по-прежнему сверхполезны для общего измерения сигнала, но не в интересующем нас случае.
Вместо этого можно отправиться на eBay или craiglist и найти аналоговый ЭЛТ-осциллограф с режимом X-Y, который обойдется в районе $50 Подойдет любой вариант с шириной полосы в 5МГц и более – все равно ЦАПы на платах v.st могут выдавать частоту максимум 2МГц.
Запоминающие дисплеи
Дисплеи с запоминающей трубкой отлично подходят для очень детальных статичных векторных изображений, но не особо подойдут для игр с высокой частотой кадров. Так что поберегите деньги и не разоряйтесь на Tek 4014.
Вектороскоп
Вектороскопы, такие как Tek 1720, использовались в телевизионных станциях для калибровки цветовых полос, и по мере перехода станций в цифровой режим их применение постепенно прекращалось. В результате таких аналоговых дисплеев на eBay предлагается очень много и за небольшие деньги. Они используют очень быстрое электростатическое отклонение и оснащены, как правило, небольшими, но очень резкими экранами. Эти дисплеи также оборудованы дифференциальными входами, что избавляет от необходимости использовать отрицательный выход на ЦАП.
Консоли Vectrex
Консоль Vectrex
Электроника Vectrex
Домашняя игровая консоль Vectrex оборудована приятным черно-белым экраном с высокой резкостью. Можно без проблем отсоединить материнскую плату от аналогового драйвера ЭЛТ и вывести провода из корпуса для подключения платы v.st.
В Vectrex используется медленная система магнитного отклонения, которая не позволяет отрисовывать столько векторов, сколько отрисовывают быстрые электростатические дисплеи. Тем не менее она намного крупнее и также предлагает вход Z, дающий возможность управления яркостью без влияния на скорость отрисовки линий.
Лазерные проекторы
Также можно использовать лазерный проектор, вот только результат получится не лучшего качества. Физические зеркала обладают определенной долей инерции, и на включение/выключение луча требуется время. В результате частота обновления падает, и изображение получается мерцающим. Некоторые специализированные игры могут работать с очень быстрыми (45-60 Kpps) гальваническими сканерами, но почти все аркады требуют отображения слишком большого количества векторов.
Проект LazyMame добился неплохих успехов, но я не могу найти никаких подробностей или исходного кода уже с 2008 года. Позже в 2013 возник проект OpenLase-Mame, который с тех пор молчит. Помимо этого, другие разработчики пробовали создавать новые лазерные игры с помощью кастомного плагина Unity. Некоторые преуспели.
MAME
MAME – это акроним от Multiple Arcade Machine Emulator, означающего эмулятор множества аркадных автоматов, и его имя себя вполне оправдывает – он способен эмулировать тысячи игр и автоматов, включая практически все когда-либо созданные векторные аркады.
Эмуляция векторных дисплеев
Фактическое свечение на векторном дисплее
Эмулированное векторное свечение
Эффект «свечения», создаваемый яркими векторными линиями, относится к одной из излюбленных игроками особенностей. В MAME есть поддержка шейдеров HLSL, которые размывают яркие линии и создают подобие этого эффекта. Сверху изображен реальный дисплей
Vectrex, а снизу эмуляция на MAME.
Патчи для подключения к дисплею
К сожалению, мой патч для MAME, который добавлял поддержку экспорта векторов, был закрыт как «неприемлемо «грязный» способ достижения желаемого результата». Так что вам потребуется клонировать мое дерево и следовать инструкциям по созданию векторного MAME. Основная часть изменений находится в src/emu/video/vector.cpp
и опирается на усекаемые окна, которые MAME использует для ограничения векторов областью экрана.
Патчи для Raspberry Pi
Я также портировал изменения в голую сборку MAME4AllPi для Raspberry Pi. Инструкции для векторного MAME на Pi аналогичны. Нужно будет клонировать дерево и вшить его в Pi. К сожалению, здесь имеется ряд проблем с джойстиком, которые еще предстоит исправить.
Играем
Вы можете поиграть в одну из оригинальных игр, Space Wars, вышедшую в 1977 году
Asteroids (1979) тоже всегда славилась популярностью и была одной из самых кассовых игр своего времени!
Lunar Lander на вектороскопе
Tempest на вектороскопе
Или, быть может, вам больше по душе придутся Lunar Lander (1979) и Tempest (1980).
Сэмулировать можно огромное число векторных игр, включая весь список Atari
Так много малоизвестных игр, что все и не перечислишь, но я собрал список проектов Vectrex, включив в него также векторные аркады, упомянутые в Википедии
Кастомизация
Пользовательские устройства ввода
Консоль Robotron собственной сборки
Robotron
Как только вы подключите векторный дисплей к MAME, вам наверняка захочется внести свои доработки. Можно без проблем собрать собственные USB HID-устройства на основе предлагаемых Adafruit аркадных джойстиков, кнопок и даже монетоприемников.
Примечание ред.: доступ к ресурсу Adafruit возможен только через VPN.
Креативное программирование с векторами
Если же вы устали от игр, то всегда можно превратить дисплей в вектороскопические часы. В Teensy 3 есть сквозные отверстия для кварцевого резонатора 32.768КГц и резервная батарея, позволяющая поддерживать точность отображаемого времени.
Можно писать игры, которые будут выполняться непосредственно на Teensy, как мой клон Asteroids, Space Rocks, или создавать какие-нибудь арт-проекты.
Некоторые энтузиасты реализуют поистине грандиозные проекты — vec9 стал первой векторной аркадой за тридцать лет, реализованной в кастомном автомате с рычагом управления, как в реальном танке.
Мы создали простую библиотеку на Processing, чтобы показать, как пишутся программы, взаимодействующие с такими дисплеями. Образец кода лежит в репозитории, а также портирован на ProcessingJS в виде демо-заставок Swarm и Random Walk.
Дополнительную информацию по платам можно найти на MAME, Vectrex и Tek 1720.