Вложений: 2
версия ёмулятора для просмотра демовых скроллов
вот оно, про что мы недавно обсуждали с Vladimir Kladov тут на форуме!
просьба к Wlodek опубликовать этот текст и ссылку на RAR в фидо:
Код:
специальная версия unreal speccy с необычным видеорежимом:
передискретизация видео-потока 50hz в частоту развертки
PC-монитора (60,70,75,100,120,... hz). используется независимая
высококачественная обработка 320*240*3(цвета) каналов, каждый кадр
интерполируется по 4 предыдущим и 4 последующим кадрам. на обработку
тратится примерно 30% процессорного времени Celeron-800,
обязательно наличие MMX, 32-битного режима с разрешением не менее
320x240. возможно наложение НЧ-фильтров с частотами отсечения
25hz (обычная 50hz-развёртка), 12hz (gigascreen), 8hz (3color) -
настраивается в ini опцией [VIDEO]Cutoff
известные проблемы: на LCD-мониторах при попытке установить
режим 320x240 с частотами выше 60hz включается развёртка 60hz,
но система думает, что используется запрошенная частота. это
приводит к рассинхронизации с эмулятором и торможению. решение:
установить minres=600, в режиме 800x600,1024x768,1280x1024
могут использоваться частоты, отличные от 60hz
известные проблемы: используется 8-битная mmx-арифметика; во
избежание переполнений сужен динамический диапазон цветовых
компонент до #40-#C0 - изображение неконтрастное (но 16-битная
арифметика в 1.5 раза медленнее)
максимальное качество достигается на CRT-мониторах с частотами
100-120 hz
unre50hz.rar - эмулятор, 7scrolls.rar - часть из insult megademo для проверки плавности скроллера
На самом деле, чтобы скроллы игрались замечательно
надо делать межкадровую интерполяцию, но очень хитрым способом: нужно брать два соседних кадра экрана zx, анализировать когда должен начать поход луч монитора, а затем только рассчитывать кадр. Причём рассчитывать смещение строки или каких то других элементов скролла, чтобы действительно не было рывков.
Пример:
Частота развёртки - 85 Гц
Частота экрана zx - 50 Гц
Тогда пусть между двум кадрам экрана ZX В данной итерации соответствует три кадра монитора (вообще то может оказаться и 1 и 2 и 3 - в зависимости от времени).
Пусть бежит бегущая строка, в первом кадре экрана zx она находится на позиции с смещением 1 пиксель относительно бордюра, во втором кадре - со смещением 2 пикселя относительно бордюра.
Тогда в первом кадре (кадры синхронизации) изображение спекка точно равно изображению на мониторе (просто копируются/преобразуются данные 1 в 1).
Во втором кадре монитора строка уже ушла с позиции в 1 пиксель, но ещё не дошла до позиции в 2 пикселя, тогда при приходе новой развёртки
строчка должна находиться в позиции 1,6 пикселя!!!
А при приходе следующего прерывания - в точке 2,2 пикселя!!!
И не должно быть ровных чисел (1 пиксель, 2 пикселя и т.д.) - они будут лишь в точке синхронизации.