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 комментариев

avatar
Плюс вдогонку подборка с самыми безумными эффектами из игр imgur.com/a/XJmb7
Всё в большинстве своём — mmc3.
avatar
Только везде где есть такой «частичный» вертикальный скроллинг используются другие техники. Про это будет следующий пост. :)
Как раз вертикальный скроллинг в hblank не укладывается и там используют еще более изощрённые вещи о которых пока не хочу рассказывать раньше статьи. :)
avatar
Круто, спасибо! Я думал, оно делается скроллом содержимого выборочных тайлов под каждый кадр, а тут вон оно как.
avatar
И так тоже делается, например, в Battletoads. Как правило для этого нужно ОЗУ графики тайлов. Хотя есть варианты и с ПЗУ (там лежат сдвинутые копии фона), например, Castle Master. А иногда бывает и то и другое сразу, и прокрутка графики тайлов, и перезапись смещения карты тайлов несколько раз за кадр.
avatar
youtu.be/FPiXLEbt3u8?t=16m40s — пример из Ninja Gaiden 3, который, как я понимаю, совмещает и скролл тайлов, и hblank-отсечение.
youtu.be/FPiXLEbt3u8?t=26m23s — а каким образом в той же игре фон выводится на передний план? это базовая фича NES?
avatar
В NES спрайты имели бит приоритета — или они рисовались над фоном или под ним. Соответственно, если спрайт не предполагалось налагать поверх фона, как в случае объекта не проникающего в стены, то ему можно было ставить бит приоритета в «под фоном» и это и давало нужный результат.
avatar
по поводу фрагмента с Ninja Gaided там тоже всё просто — фигурка самого ниндзи изображена через механизм спрайтов, а всё остальное (фон) делается техникой HBlank-отсечения. Спрайты это отдельный независимый от фона слой изображения и ими нередко затыкаются такие «дырки». В какой то заставке мегамена тоже есть интересное такое применение, когда он на небоскрёбе явобы вертикально вниз скроллящемся возникает — окна небоскрёба на самом деле спрайты.
avatar
Понял, замок выплывающий тогда тоже спрайтами подрисован по бокам?
avatar
О, до замка я и не досмотрел. Весьма любопытный должен быть выкрутас, ибо больше 8 спрайтов в строке денди не может вывести и всего спрайтов на экране может быть не более 64. Поэтому большие массивы спрайтов исключены.
Можно подметить, что голова ниндзи предусмотрительно уводится ниже уровня замка — скорее всего как раз для непересечения спрайтов.
Однако замок слишком велик для спрайтов и толст сам по себе. Было бы любопытно взглянуть на эмуляторе в этот момент что там происходит в видеопамяти конечно. Сразу можно сказать, что нижняя часть замка на чёрном фоне и верхняя часть на оранжевом фоне — это обычные фоны с hblank-отсечением. Крохотный шпиль задевающий облака — спрайт. Так же можно идентифицировать в узком слое зелено-жёлтых и часто повторяющихся гор как раз технику скролла тайлов из Sword Master.
И вот далее уже на грани возможного — если толстые части замка на фоне гор укладываются по ширине в 8 тайлов 8x8, то значит это спрайты и всё просто. Если нет — тут должны быть какие то части динамического характера тайлов, возможно даже горы на фоне. Так или иначе тут явно идёт изощрённая работа на грани возможного.
avatar
Замок укладывается в лимит спрайтов, неспроста он такой формы, с дыркой и разной ширины на разных уровнях. Подобный визуальный трюк (чтобы казалось больше, чем на самом деле) встречается и в других играх, в том числе в заставках. Помню, меня спрашивали про аналогичный случай, забыл в какой игре, возможно в другой части NG.

Вообще 64 пикселя спрайтов — это четверть ширины экрана, не так уж мало.
avatar
Есть где-то отменная статья про то как боролись в играх на денди за красивую экранную заставку — где и как спрайтами подрисовывали статику и так далее, чтобы получался сложный рисунок из как бы неповторяющихся тайлов. Концептуально нечто наподобие как на спектрумах воюют с ограничениями цветности знакомест, но со своей тайловой колокольни. Если не ошибаюсь в какой то будущей статье у меня будет на неё ссылка.
avatar
> Есть где-то отменная статья про то как боролись в играх на денди за красивую экранную заставку
Вот: hypr.ru/blog/graphics/283.html

А её автор — и есть сам Shiru. Так что вы, по сути, автору про его же статью рассказываете :)
avatar
Хаха! :) Действительно. Пересмотрел свои статьи, имеено да, эта ссылка упоминалась gamedev.ru/flame/forum/?id=226622&page=3#m32 в первой версии статье о мапперах денди. «Вот здесь: hypr.ru/blog/graphics/283.html есть отличная статья на тему того какими ухищрениями занимались создатели видеоигр для денди для этого дела. Частично там затронута и тема мапперов». В процессе реструктуризации она потерялась оттуда, ибо более уместна в статье про видеочип же.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.