VBlank и HBlank на примере Famicom/NES/Денди

Тема в разделе "WASM.ARTICLES", создана пользователем aa_dav, 12 окт 2021.

  1. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    [​IMG]
    Видеочип Famicom/NES/Денди формировал изображение для электронно–лучевой трубки телевизора и изображение это формировалось в нескольких чередующихся фазах. Сперва начинали рисоваться строки пикселей сверху–вниз слева–направо — при этом период пока рисуется весь набор строк называют VDraw (vertical draw — вертикальная отрисовка). Каждый период VDraw циклически состоит из отрисовок отдельных строк — HDraw (horizontal — горизонтальная отрисовка), каждая из которых сменяется периодом возврата луча на следующую строку (HBlank — обратный ход строчной развёртки). Когда же все строки кадра отрисовались следует период VBlank (обратного хода луча), пока кинескоп «отдыхает», после чего начинает рисоваться следующий кадр.
    Видеочип денди настолько плотно занимал шину видеопамяти во время VDraw, что почти полностью блокировал доступ к ней центральному процессору, поэтому последнему приходилось успевать обновлять содержимое её во время периода VBlank — если он не успевал это сделать, то фпс падал минимум в 2 раза — что можно было заметить в такой игре как Contra Force.
    Характерно, что периоды VDraw/VBlank из–за этого факта использовались во всех играх в качестве таймера отсчитывающего темп хода игры и даже скорости воспроизведения музыки — отчего игры разных регионов могут работать со слегка разной скоростью — дело в том, что у американской системы телевидения NTSC обновления кадров происходят 60 раз в секунду, в то время как у европейской PAL — 50 раз.
    С HBlank же связана одна весьма распространённая техника, как я её называю для себя «HBlank–отсечения».
    Видеочип денди был несколько ограничен — он мог отрисовывать только один скроллящийся фон состоящий из плиток тайлов, а над ним до 64 спрайтов 8x8 или 8x16, но при этом еще не более 8 спрайтов в одной строке — превышения терялись. Чтобы побороть проблему 8 спрайтов в строке игры нередко начинали рисовать их в разном порядке, тогда они характерно «перемигивались», но были видны все (хоть и по очереди).
    Единственный задний фон тоже создавал проблемы — так как он скроллился как единое целое, то возникал вопрос — как, например, реализовать панель с игровой информацией — «status bar»? Вот для этого часто был использован период HBlank — во время него центральный процессор мог успеть изменить то как и куда прокручен задний фон и в результате создать горизонтальный «разрыв» его отображения, что выглядело как независимо скроллящиеся куски изображения.

    Например в игре Bomberman задний фон в видеопамяти мог выглядеть вот так:
    [​IMG]
    Но изображение на телевизоре выглядело вот так:
    [​IMG]
    Здесь видно, что первые три строки тайлов «приклеены» к верхней части экрана для вывода статистики, на границе же с полем происходит «разрыв» через HBlank–отсечение и параметры прокрутки меняются во время обратного хода луча, чтобы выводить плоскость с лабиринтом в нужном месте.
    Как я уже писал в предыдущей статье, в железе самой денди возможно было сделать только одно HBlank–отсечение за кадр с помощью так называемого zero–sprite–hit. Чтобы делать сразу много HBlank–отсечений за кадр приходилось расширять способности консоли посредством чипов на картриджах — так называемых мапперов.

    Самый известный такой эффект — так называемый «параллакс» — когда части заднего фона прокручиваются по горизонтали с разной скоростью, видно на первой гифке этой статьи на примере игры Vice (Gundec). Там же видно, что в Vice кроме этого на данной технике еще сделали эффект колыхающейся воды — перехват HBlank у неё происходит в каждой строчке.
    по ссылке можно посмотреть mp4-видео процесса...
    Как должно быть понятно такие «нарезки слоёв» могли были быть выполнены только по горизонтальным границам, поэтому применения HBlank–отсечений нередко были довольно изобретательны. Вот, например, босс в игре Chip & Dale 2 (перемотать на 9:22):



    Спрайты такого большого размера на денди невозможны — на самом деле босс этот это большой кусок заднего фона, выводящийся над полом с другими параметрами прокрутки, создающими иллюзию его самостоятельного движения. Это объясняет почему этот босс не выводится поверх другого заднего фона — это просто невозможно. Другой босс игры — привидение идёт чуть дальше на 5:35.
    У него задний фон со свечами подменяется опять таки подвижным слоем с боссом, чтобы создать ненавязчиво иллюзию, что этот задний фон есть — но на самом деле эти «выключения света» созданы исключительно из–за технических ограничений консоли.
    Аналогичным образом был сделан босс–самолёт в игре Contra Force (перемотать на 11:20):



    В общем перехват HBlank был существенным инструментом для придания играм на денди зрелищности (и далеко не только на ней).
    [​IMG]
    [​IMG]
     
    Ronin_, Thetrik и Mikl___ нравится это.