Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Эмуляция ZX Spectrum: графика

Радиолюбитель. Ваш компьютер» 5/2001)
Дата последнего редактирования: 17.04.2003.

Введение
О частоте кадров, мерцании и плавности
Двухэкранные и трёхэкранные картинки
Атрибутные эффекты
Chunk-эффекты
Убираем «квадратичность»
Заключение
Литература

Введение

В последние годы всё большее распространение получают программы-эмуляторы, позволяющие использовать AMiGA или PC в качестве дешёвого заменителя ZX Spectrum. ;–) Эмуляторов существуют десятки, причём большая часть из них написана в ex-USSR.

Один из главных критериев при выборе эмулятора — насколько получаемое с его помощью изображение похоже на оригинальное. А в этой статье вы сможете прочитать о том, как сделать изображение в эмуляторе даже лучше, чем у настоящего ZX Spectrum!

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

О частоте кадров, мерцании и плавности

Частота кадров в реальном ZX Spectrum — около 50 Гц. На эту частоту рассчитан подключаемый к ZX Spectrum монитор или телевизор. В то же время подключаемые к AMiGA или PC современные SVGA-мониторы рассчитаны на работу с большей частотой кадров. Поэтому время послесвечения люминофора у них меньше, и как следствие — при частоте кадров 50 Гц изображение сильно мерцает.

Можно установить частоту кадров 100 Гц и каждый кадр эмулируемого ZX Spectrum показывать два раза. При этом мерцание совершенно исчезнет, но появится другая проблема: движущееся изображение будет неприятно раздваиваться. Таковы особенности человеческого зрения: движение будет выглядеть плавным лишь в том случае, если каждый кадр показывается новая его фаза. Это хорошо знают демомейкеры, и именно поэтому в demo стараются выводить новое изображение в каждом кадре (так называемые one-frame эффекты).

Раньше я не видел способов решения этой проблемы — пока не прочитал небольшую заметку [1], в которой рассказывается о системе Digital Natural Motion. Эта система разработана компанией Philips с целью придания плавности воспроизведению движения на экране. Она оценивает движение (в том числе и разнонаправленное), создаёт и вставляет новые кадры между оригинальными кадрами.

Также любопытную информацию я обнаружил в [2] — там сообщалось о создании компанией ATI Tecnologies сверхбыстрого графического 3D-движка Charisma Engine, обеспечивающего аппаратную поддержку покадровой интерполяции (на основе начального и конечного кадров формируется цепочка промежуточных изображений) для графического процессора, известного под кодовым названием Rage 6.

Это как раз то, что надо: если вставить между каждыми двумя кадрами эмулируемого ZX Spectrum промежуточный кадр, получится как раз 100 кадров в секунду. Движение будет ещё плавнее, чем на реальном ZX Spectrum!

Но и это ещё не всё! В эмуляторе можно сделать плавными даже те графические эффекты, которые не являются таковыми на реальном ZX Spectrum (например, когда программа обновляет изображение не 50 раз в секунду, а 25 или ещё реже). Для этого достаточно взять базовые кадры и построить промежуточные.

Только вот как это сделать? Очевидно, в эмуляторе придётся реализовать систему оценки движения на экране. Какими должны быть принципы работы такой системы? Секретов фирмы Philips я не знаю, но кое-что предположить могу. По-видимому, в соседних кадрах надо каким-либо образом распознавать движущиеся объекты (в простейшем случае — одинаковые участки изображения, координаты которых меняются от одного кадра к другому), затем для каждого объекта определять скорость (по изменению координат), ну а при известных скоростях уже нетрудно построить любое число промежуточных фаз движения объектов.

Рис. 1. Исходные два соседних кадра изображения.


Рис. 2. Распознан движущийся объект, определены его координаты в каждом кадре.
x=20, y=10

x=30, y=30

x=(20+30)/2=25, y=(10+30)/2=20

Рис. 3. Построена промежуточная фаза движения.

Разумеется, всё так просто лишь в случае равномерного прямолинейного движения плоских объектов. В общем случае объекты могут быть трёхмерными, двигаться с ускорением и по сложным криволинейным траекториям, а вдобавок ещё менять размеры и форму. Для распознавания и оценки параметров такого движения придётся анализировать уже не два соседних кадра, а гораздо больше. А ведь всё это надо успевать делать в реальном времени, да ещё и параллельно с эмуляцией!

К счастью, на ZX Spectrum в большинстве случаев движение происходит с постоянной скоростью и только по одной координате, да и объект на экране обычно всего один (пример такого движения — скроллинг текста). При таких условиях решить задачу построения промежуточных кадров вполне реально.

Кстати, насчёт скроллинга текста. В спектрумовских электронных газетах и журналах этот самый скроллинг (если текст раскрашен или есть цветные иллюстрации), во-первых, познакоместный (попиксельным он принципиально не может быть из-за того, что в одном знакоместе могут быть лишь два цвета), а во-вторых, неплавный (так как быстродействия ZX Spectrum не хватает на то, чтобы перерисовывать экран каждый кадр). Так вот, построив в эмуляторе промежуточные кадры, мы получим плавный попиксельный скроллинг! Ведь в графическом режиме, который используется в эмуляторе, нет ограничения «только два цвета в знакоместе» — а значит, в промежуточных кадрах хоть каждая точка может быть своего цвета!

Двухэкранные и трёхэкранные картинки

Графические возможности ZX Spectrum, увы, невелики: всего пятнадцать цветов (с учётом градаций яркости), да ещё, как уже упоминалось, в каждом знакоместе могут быть лишь два цвета (причем не любые два из пятнадцати, так как яркость задаётся для всего знакоместа). Понятно, что эти ограничения весьма неудобны, и их стремятся преодолеть.

Вот один из используемых для этого способов: для картинки создаются две различных области атрибутов (напомню, что именно атрибуты определяют раскраску изображения), которые чередуются каждые 1/50 секунды. Это приводит к появлению смешанных цветов (а значит, к расширению цветовой палитры). Пусть, например, для какого-то пиксела в одной области атрибутов задан жёлтый цвет, а в другой — красный. На экране он будет по очереди то жёлтым, то красным, а зритель, из-за инерционности человеческого зрения, увидит его оранжевым.

Именно так, в частности, раскрашены тексты в последнeм номерe электронной газеты BornDead. Всего же при таком способе вывода изображения можно получить 120 различных цветов, но смешанные цвета будут мерцать с частотой 25 Гц (степень мерцания зависит от того, какие именно цвета смешиваются).

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

Есть ещё и такой приём: для выводимой картинки формируются три изображения, представляющие собой красную, зелёную и синюю составляющие. При их быстрой смене мы увидим цветное изображение, где каждая точка может быть окрашена своим цветом — одним из восьми. Правда, мерцание будет ещё заметнее — с частотой 16,7 Гц.

Как видим, недостаток всех этих способов — мерцание изображения. Тут нам и поможет эмулятор! Действительно, достаточно объединять два (три) соседних кадра, формировать на их основе новый, «смешанный» кадр (естественно, с большим количеством цветов) и выводить его на экран — уже без всякого мерцания! Такая возможность может быть очень полезной не только при просмотре demo, но и, скажем, при проведении gfx compo для двух- и трёхэкранных картинок. Кстати, распознавать ситуацию, когда программа выводит на экран такую картинку, эмулятор может автоматически.

Атрибутные эффекты

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

Этот приём используется в так называемых атрибутных эффектах. Экран заполняется «шахматной» текстурой (рис. 4), и если соответствующий знакоместу атрибут имеет разные ink и paper, то мы увидим в этом знакоместе смешанный цвет.

Рис. 4


Иногда используют текстуру другой формы (рис. 5). В этом случае можно получить ещё больше цветов, но и зритель должен будет отойти от экрана на большее расстояние для комфортного рассматривания картинки.

Рис. 5


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

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

Chunk-эффекты

Чтобы повысить количество оттенков в монохромном изображении, используют такой приём: квадрат 4x4 пиксела считается одним большим «пикселом» с условной яркостью от 0 до 16, в зависимости от наложенной текстуры (рис. 6). Вместо 17 возможных градаций яркости часто используют лишь 16 — это удобнее для хранения изображения в памяти и вывода его на экран. Пример получаемого таким образом изображения вы можете увидеть на рис. 7.

Рис. 6

Рис. 7

Опять-таки, вместо кажущихся 16 градаций яркости, получаемых с помощью текстур, в эмуляторе можно отображать реальные 16 градаций яркости. Легко реализовать и автоматическое включение этого режима.

Убираем «квадратичность»

Эффекты, рассмотренные в двух предыдущих разделах, выглядят не очень хорошо из-за того, что изображение разбито на крупные квадраты. Но и тут эмулятор поможет нам: если произвести «размытие» изображения, то вместо квадратов мы увидим плавные переходы цветов! Мало того, что квадраты исчезнут, так ещё и цветов будет больше, и разрешение можно при этом повысить (учитывая возможности видеокарты и быстродействие компьютера).

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

Заключение

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

Литература

  1. «Мир вопросов и ответов». «Вашему дому» 4/2000.
  2. «Новости». «Компьютерра» 10/2000.
Страница Ивана Рощина > Статьи >