NES TDD

273. Таблица шаблонов во фреймбуфер

Рендеринг отладочной сетки таблицы шаблонов во фреймбуфер.

Урок 273 из 356 · tests/chapter_05_rendering_pipeline/test_273_pattern_table_to_framebuffer.py

Файл для создания

emulator/rendering/pattern_table_renderer.py

Почему этот шаг важен

В эмуляторе уже есть чистые вспомогательные функции CHR

decode_pattern_table(pattern_table_bytes)
    -> 256 decoded 8x8 tiles of color indexes

build_pattern_table_debug_grid(decoded_tiles)
    -> 128x128 color-index debug grid

А в конвейере рендеринга теперь есть

color_index_grid_to_framebuffer(grid, palette)
    -> RGB Framebuffer

Этот шаг объединяет эти элементы в одну чистую вспомогательную функцию

pattern_table bytes + RGB palette -> 128x128 Framebuffer

Что такое отладочный фреймбуфер таблицы шаблонов? Таблица шаблонов содержит 256 тайлов. Каждый тайл имеет размер 8x8 пикселей. Для отладки мы располагаем эти тайлы следующим образом:

16 tiles across * 8 pixels = 128 pixels wide
16 tiles down   * 8 pixels = 128 pixels high

Пример возможной реализации

from emulator.ppu.chr_decoder import (
    build_pattern_table_debug_grid,
    decode_pattern_table,
)
from emulator.rendering.color_index_renderer import color_index_grid_to_framebuffer
from emulator.rendering.framebuffer import Framebuffer, RGBColor


def pattern_table_to_framebuffer(
    pattern_table_bytes: bytes,
    palette: list[RGBColor],
) -> Framebuffer:
    decoded_tiles = decode_pattern_table(pattern_table_bytes)
    grid = build_pattern_table_debug_grid(decoded_tiles)
    return color_index_grid_to_framebuffer(grid, palette)

Архитектурное правило

Этот рендерер должен объединять уже существующие чистые функции. Не дублируйте здесь логику декодирования CHR.

Важное правило для фикстур

Используйте только синтетические байты CHR. Не используйте в этом тесте данные CHR из коммерческих ROM.

Вне рамок этого шага

  • отображение через pygame
  • запись файлов изображений
  • рендеринг таблицы имён
  • поиск в палитровой RAM
  • рендеринг спрайтов

Запустить этот урок

uv run pytest tests/chapter_05_rendering_pipeline/test_273_pattern_table_to_framebuffer.py -v