© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Радиолюбитель. Ваш
компьютер» 5/2001)
Дата последнего редактирования: 17.04.2003.
Введение
О частоте кадров, мерцании и плавности
Двухэкранные и трёхэкранные картинки
Атрибутные эффекты
Убираем «квадратичность»
Заключение
Литература
В последние годы всё большее распространение получают
Один из главных критериев при выборе эмулятора насколько получаемое с его помощью изображение похоже на оригинальное. А в этой статье вы сможете прочитать о том, как сделать изображение в эмуляторе даже лучше, чем у настоящего ZX Spectrum!
Надеюсь, изложенные здесь соображения покажутся интересными как «реальным» пользователям, так и «эмуляторщикам», а в особенности тем, кто задумал написать свой собственный эмулятор, будучи неудовлетворённым ни одним из существующих.
Частота кадров в реальном ZX Spectrum около 50 Гц. На эту
частоту рассчитан подключаемый к ZX Spectrum монитор или телевизор. В то же
время подключаемые к AMiGA или PC современные
Можно установить частоту кадров 100 Гц и каждый кадр эмулируемого ZX
Spectrum показывать два раза. При этом мерцание совершенно исчезнет, но
появится другая проблема: движущееся изображение будет неприятно
раздваиваться. Таковы особенности человеческого зрения: движение будет
выглядеть плавным лишь в том случае, если каждый кадр показывается новая его
фаза. Это хорошо знают демомейкеры, и именно поэтому в demo стараются выводить
новое изображение в каждом кадре (так называемые
Раньше я не видел способов решения этой проблемы пока не прочитал небольшую заметку [1], в которой рассказывается о системе Digital Natural Motion. Эта система разработана компанией Philips с целью придания плавности воспроизведению движения на экране. Она оценивает движение (в том числе и разнонаправленное), создаёт и вставляет новые кадры между оригинальными кадрами.
Также любопытную информацию я обнаружил в [2] там сообщалось о создании компанией ATI
Tecnologies сверхбыстрого графического
Это как раз то, что надо: если вставить между каждыми двумя кадрами эмулируемого ZX Spectrum промежуточный кадр, получится как раз 100 кадров в секунду. Движение будет ещё плавнее, чем на реальном ZX Spectrum!
Но и это ещё не всё! В эмуляторе можно сделать плавными даже те графические эффекты, которые не являются таковыми на реальном ZX Spectrum (например, когда программа обновляет изображение не 50 раз в секунду, а 25 или ещё реже). Для этого достаточно взять базовые кадры и построить промежуточные.
Только вот как это сделать? Очевидно, в эмуляторе придётся реализовать
систему оценки движения на экране. Какими должны быть принципы работы такой
системы? Секретов фирмы Philips я не знаю, но
![]() |
![]() |
|
|
![]() |
Разумеется, всё так просто лишь в случае равномерного прямолинейного движения плоских объектов. В общем случае объекты могут быть трёхмерными, двигаться с ускорением и по сложным криволинейным траекториям, а вдобавок ещё менять размеры и форму. Для распознавания и оценки параметров такого движения придётся анализировать уже не два соседних кадра, а гораздо больше. А ведь всё это надо успевать делать в реальном времени, да ещё и параллельно с эмуляцией!
К счастью, на ZX Spectrum в большинстве случаев движение происходит с постоянной скоростью и только по одной координате, да и объект на экране обычно всего один (пример такого движения скроллинг текста). При таких условиях решить задачу построения промежуточных кадров вполне реально.
Кстати, насчёт скроллинга текста. В спектрумовских электронных газетах и
журналах этот самый скроллинг (если текст раскрашен или есть цветные
иллюстрации),
Графические возможности ZX Spectrum, увы, невелики: всего пятнадцать цветов (с учётом градаций яркости), да ещё, как уже упоминалось, в каждом знакоместе могут быть лишь два цвета (причем не любые два из пятнадцати, так как яркость задаётся для всего знакоместа). Понятно, что эти ограничения весьма неудобны, и их стремятся преодолеть.
Вот один из используемых для этого способов: для картинки создаются две
различных области атрибутов (напомню, что именно атрибуты определяют раскраску
изображения), которые чередуются каждые 1/50 секунды. Это приводит к появлению
смешанных цветов (а значит, к расширению цветовой палитры). Пусть, например,
для
Именно так, в частности, раскрашены тексты в последнeм номерe электронной газеты BornDead. Всего же при таком способе вывода изображения можно получить 120 различных цветов, но смешанные цвета будут мерцать с частотой 25 Гц (степень мерцания зависит от того, какие именно цвета смешиваются).
Иногда так же чередуют двa полностью различных изображения (например, движущийся текст и фоновая цветная картинка). Этот способ используется не столько для увеличения количества цветов, сколько для вывода более двух цветов в одном знакоместе.
Есть ещё и такой приём: для выводимой картинки формируются три изображения, представляющие собой красную, зелёную и синюю составляющие. При их быстрой смене мы увидим цветное изображение, где каждая точка может быть окрашена своим цветом одним из восьми. Правда, мерцание будет ещё заметнее с частотой 16,7 Гц.
Как видим, недостаток всех этих способов мерцание изображения. Тут нам и поможет эмулятор! Действительно, достаточно объединять два (три) соседних кадра, формировать на их основе новый, «смешанный» кадр (естественно, с большим количеством цветов) и выводить его на экран уже без всякого мерцания! Такая возможность может быть очень полезной не только при просмотре demo, но и, скажем, при проведении gfx compo для двух- и трёхэкранных картинок. Кстати, распознавать ситуацию, когда программа выводит на экран такую картинку, эмулятор может автоматически.
Расширить цветовую палитру можно также, используя другую особенность человеческого зрения: если в некоторой области экрана рядом расположены пикселы двух различных цветов, то наблюдатель, находясь на достаточном расстоянии, увидит эту область окрашенной в некоторый средний цвет.
Этот приём используется в так называемых атрибутных эффектах. Экран заполняется «шахматной» текстурой (рис. 4), и если соответствующий знакоместу атрибут имеет разные ink и paper, то мы увидим в этом знакоместе смешанный цвет.
![]() |
![]() |
Иногда используют текстуру другой формы (рис. 5). В этом случае можно получить ещё больше цветов, но и зритель должен будет отойти от экрана на большее расстояние для комфортного рассматривания картинки.
![]() |
![]() |
В эмуляторе можно реализовать специальный режим, при включении которого каждое знакоместо экрана вместо чередующихся пикселов разных цветов будет равномерно окрашиваться в некоторый средний цвет. Тогда для просмотра атрибутных эффектов не нужно будет отходить от монитора на значительное расстояние.
Можно сделать и так, что этот режим будет включаться автоматически, как только эмулятор обнаружит, что экран заполнен одной из двух рассмотренных выше текстур.
Чтобы повысить количество оттенков в монохромном изображении, используют такой приём: квадрат 4x4 пиксела считается одним большим «пикселом» с условной яркостью от 0 до 16, в зависимости от наложенной текстуры (рис. 6). Вместо 17 возможных градаций яркости часто используют лишь 16 это удобнее для хранения изображения в памяти и вывода его на экран. Пример получаемого таким образом изображения вы можете увидеть на рис. 7.
![]() |
![]() |
Эффекты, рассмотренные в двух предыдущих разделах, выглядят не очень хорошо
Возможно, после размытия неплохо было бы применить фильтр, напротив, увеличивающий чёткость изображения.
Наверно, не только мне было бы интересно посмотреть, как выглядели бы
различные игры, demo и другие спектрумовские программы, если бы в эмуляторе
были реализованы описанные выше способы улучшения изображения. Надеюсь, что