VBlank и HBlank на примере Famicom/NES/Денди
Видеочип 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 задний фон в видеопамяти выглядел вот так:
Но изображение на телевизоре выглядело вот так:
Здесь видно, что первые три строки тайлов «приклеены» к верхней части экрана для вывода статистики, на границе же с полем происходит «разрыв» через HBlank–отсечение и параметры прокрутки меняются во время обратного хода луча, чтобы выводить плоскость с лабиринтом в нужном месте.
Как я уже писал в предыдущей статье, в железе самой денди возможно было сделать только одно HBlank–отсечение за кадр с помощью так называемого zero–sprite–hit. Чтобы делать сразу много HBlank–отсечений за кадр приходилось расширять способности консоли посредством чипов на картриджах — так называемых мапперов.
Самый известный такой эффект — так называемый «параллакс» — когда части заднего фона прокручиваются по горизонтали с разной скоростью, видно на первой гифке этой статьи на примере игры Vice (Gundec). Там же видно, что в Vice кроме этого на данной технике еще сделали эффект колыхающейся воды — перехват HBlank у неё происходит в каждой строчке.
по ссылке можно посмотреть mp4-видео процесса...
Как должно быть понятно такие «нарезки слоёв» могли были быть выполнены только по горизонтальным границам, поэтому применения HBlank–отсечений нередко были довольно изобретательны. Вот, например, босс в игре Chip & Dale 2 (перемотать на 9:22):
Спрайты такого большого размера на денди невозможны — на самом деле босс этот это большой кусок заднего фона, выводящийся над полом с другими параметрами прокрутки, создающими иллюзию его самостоятельного движения. Это объясняет почему этот босс не выводится поверх другого заднего фона — это просто невозможно. Другой босс игры — привидение идёт чуть дальше на 5:35.
У него задний фон со свечами подменяется опять таки подвижным слоем с боссом, чтобы создать ненавязчиво иллюзию, что этот задний фон есть — но на самом деле эти «выключения света» созданы исключительно из–за технических ограничений консоли.
Аналогичным образом был сделан босс–самолёт в игре Contra Force (перемотать на 11:20):
В общем перехват HBlank был существенным инструментом для придания играм на денди зрелищности (и далеко не только на ней).
13 комментариев
Всё в большинстве своём — mmc3.
Как раз вертикальный скроллинг в hblank не укладывается и там используют еще более изощрённые вещи о которых пока не хочу рассказывать раньше статьи. :)
youtu.be/FPiXLEbt3u8?t=26m23s — а каким образом в той же игре фон выводится на передний план? это базовая фича NES?
Можно подметить, что голова ниндзи предусмотрительно уводится ниже уровня замка — скорее всего как раз для непересечения спрайтов.
Однако замок слишком велик для спрайтов и толст сам по себе. Было бы любопытно взглянуть на эмуляторе в этот момент что там происходит в видеопамяти конечно. Сразу можно сказать, что нижняя часть замка на чёрном фоне и верхняя часть на оранжевом фоне — это обычные фоны с hblank-отсечением. Крохотный шпиль задевающий облака — спрайт. Так же можно идентифицировать в узком слое зелено-жёлтых и часто повторяющихся гор как раз технику скролла тайлов из Sword Master.
И вот далее уже на грани возможного — если толстые части замка на фоне гор укладываются по ширине в 8 тайлов 8x8, то значит это спрайты и всё просто. Если нет — тут должны быть какие то части динамического характера тайлов, возможно даже горы на фоне. Так или иначе тут явно идёт изощрённая работа на грани возможного.
Вообще 64 пикселя спрайтов — это четверть ширины экрана, не так уж мало.
Вот: hypr.ru/blog/graphics/283.html
А её автор — и есть сам Shiru. Так что вы, по сути, автору про его же статью рассказываете :)