« Архитектура Game Boy Advance (index)

Архитектура Game Boy Advance

Chapter 4: Графика


Содержание

  1. Организация контента
  2. Построение кадра
    1. Тайлы
    2. Фоны
    3. Спрайты
    4. Результат
  3. Кроме тайлов

Прежде чем мы начнем, вам может показаться, что эта система есть смесь SNES и Game Boy. В самом деле, графическое ядро всё ещё называется PPU. Поэтому для начала я рекомендую прочитать эти статьи, так как я буду рассматривать множество ранее разъясненных понятий.

По сравнению с прошлыми приставками серии Game Boy, у нас появился цветной LCD дисплей, который может показывать до 32 768 цветов (15-бит). Его разрешение 240 x 160 пикселей, а частота обновления примерно 60Гц.

Организация контента

Image
Архитектура памяти PPU.

Графика распределяется по следующим областям памяти:

Построение кадра

Если вы читали прошлые статьи, то подход GBA покажется вам знакомым, хотя дополнительная функциональность может вас удивить. Тем не менее тот факт, что новая система работает только от двух батареек AA, делает это исследование еще более захватывающим.

Я одолжу графику из Sonic Advance 3 от Sega, чтобы проиллюстрировать, как составляется кадр.

Тайлы

Image
Эти два блока состоят из тайлов с 4 битами на пиксель.

Image
Здесь можно заметить странные вертикальные узоры, это не графика, а т. н. 'Tile Maps' (тайловые карты, смотрите следующий раздел).

Image
Эти два блока зарезервированы под спрайты.

Пары charblock-ов внутри VRAM.

Тайлы GBA - это растровые изображения размером строго 8x8 пикселей, они могут использовать 16 цветов (4 bpp) или 256 цветов (8 bpp). Плитки размером 4 bpp занимают 32 байта, а 8 bpp - 64 байта.

Тайлы могут храниться в любом месте VRAM. Однако, для PPU их нужно группировать в charblock-и: непрерывные области по 16 КБ. Каждый такой блок зарезервирован для определенного типа слоя (либо фон, либо спрайты), и программисты решают где начинается каждый блок. Это может привести к перекрытиям, что, как следствие, позволяет блоками иметь общие тайлы.

Из-за размера блока символов в одном блоке можно хранить до 256 плиток 8 bpp или 512 плиток 4 bpp. В целом, можно выделить до шести charblock-ов, что в сумме требует 96 КБ памяти: ровно столько, сколько есть VRAM в этой консоли.

Для фонов можно использовать только четыре, а два можно применить для спрайтов.

Фоны

Image
Фоновый слой 0 (BG0).

Image
Фоновый слой 2 (BG2).

Image
Фоновый слой 3 (BG3).
Этот конкретный слой сдвигается по горизонтали на определенных сканлайнах для имитации эффектов воды.

Используемые в фонах статические слои.

Фоновый слой в этой системе значительно улучшился со времен Game Boy Color. Она наконец-то включает в себя некоторые функции из Super Nintendo (помните аффинные преобразования?).

PPU умеет рисовать до четырех фоновых слоев. Возможности каждого из них зависят от выбранного режима работы :

Размеры каждого слоя могут быть до 512x512 пикселей. Если слой аффинный, он может быть размером до 1024x1024 пикселей.

Совокупность данных, которая задает фоновый слой, называют Tile Map. Эта информация закодирована в форме screenblock-ов: структуры, определяющей части фонового слоя (32 на 32 тайла). Screenblock занимает всего 2 КБ, но для построения всего слоя их требуется несколько штук. Программисты могут расположить эти блоки где угодно в VRAM, в том числе внахлёст с фоновыми charblock-ами. Это значит, что не каждый тайл будет содержать графику!

Спрайты

Image
Отрисованный спрайтовый слой

Спрайт может быть размером до 64x64 пикселей. Однако из-за маленького размера экрана, они будут занимать большую его часть.

Если этого недостаточно, PPU теперь умеет применять к спрайтам аффинные преобразования!

Спрайтовые записи занимают 32 бита, их значения можно разделить на две группы:

Результат

Image
Все слои объединены (Tada!).

Как обычно, PPU объединяет все слои автоматически, но это еще не все! Система может наложить на эти слои несколько эффектов:

С другой стороны, для обновления кадра есть несколько опций на выбор:

Кроме тайлов

Иногда мы можем захотеть составить такой фон, с которым тайловый движок не сможет справиться. Современные консоли решили это, внедрив архитектуру с буфером кадра, позволяющим программистам самостоятельно менять каждый пиксель. Однако он нереализуем при очень маленьком объёме ОЗУ... Ну, у GBA как раз есть 96 КБ VRAM. Этого достаточно для выделения растрового изображения размером как наш LCD экран.

Хорошей новостью является то, что PPU фактически реализовал эту функциональность, включив три дополнительных режима, которые называются bitmap modes :

Причина наличия двух растровых изображений заключается в возможности перелистывания страниц: Рисование поверх отображаемого растрового изображения может привести к появлению некоторых странных артефактов во время процесса. Если вместо этого манипулировать другим, то ни один из глюков не будет показан пользователю. Как только вторая растровая карта будет готова, PPU можно обновить, чтобы указать на вторую, эффективно поменяв отображаемый кадр местами.

Image
Super Monkey Ball Jr. (2002).
Растровый режим позволил процессору рисовать рудиментарную 3D графику.
Объекты переднего плана это спрайты (отдельный слой).

Image
Tonc's demo.
Растровая картинка с примитивами.
Обратите внимание, экран не показывает существенных узоры тайловых движков.

Image
Эпизод распространялся в виде картриджа GBA Video (видео , конечно, сильно пострадало от сжатия).

Примеры программ с растровыми режимами.

В целом звучит как передовая фишка, однако большинство игр продолжало пользоваться тайловым движком. Почему? Потому, что на практике, растры сьедают очень много ресурсов ЦП.

Видите ли, тайловый движок позволяет процессору делегировать большинство вычислений графическому чипу. А вот система кадровых буферов от PPU ограничена только отображением сегмента памяти на единственном фоновом слое, что значит больше нет никаких индивидуальных аффинных преобразований, наложений или эффектов если процессор сам их не просчитает. Фреймбуффер также занимает 80 КБ памяти, так что только 16 КБ (половина) доступны для хранения спрайтовых тайлов.

Вот почему эти режимы применяются в исключительных случаях, таких как проигрывание видео (Game Boy Advance Video полностью на это полагалось) или отрисовка 3D геометрии (рендеринг осуществлялся процессором). В любом случае результаты были мягко говоря впечатляющими.


Previous: 3. Процессор

Next: 5. Звук


Rodrigo Copetti © 2026 RSS Feed

Переключиться на современную версию

Домашняя страница · Статьи · Поддержка · Об авторе · О сайте