308. Framebuffer de renderizado en Console

Exponer un framebuffer completo de fondo+sprites desde Console.

Lección 308 de 356 · tests/chapter_09_sprite_rendering/test_308_console_render_framebuffer.py

Archivo a actualizar

emulator/console.py

Por qué existe este paso

Los frontends no deberían saber cómo extraer por separado la memoria de fondo, el OAM de sprites, la RAM de paleta de sprites o las tablas de patrones de sprites. Console coordina los sistemas CPU/PPU, así que debería exponer un método orientado al frontend:

console.render_framebuffer()

Este método devuelve el framebuffer visible actual usando

background renderer
PPU.oam sprites
sprite palette RAM $3F10-$3F1F
sprite pattern table selected by PPUCTRL bit 3

Ejemplo de implementación sugerido

# Add this constant to the existing ppu_background_renderer import.
from emulator.rendering.ppu_background_renderer import PALETTE_RAM_ADDR


def render_framebuffer(self) -> Framebuffer:
    background = self.render_background_framebuffer()

    sprite_palette_start = PALETTE_RAM_ADDR + 16
    sprite_palette_ram = bytes(
        self.ppu.ppu_bus.read(sprite_palette_start + offset)
        for offset in range(16)
    )
    sprite_palettes = build_sprite_palettes_from_palette_ram(sprite_palette_ram)

    pattern_table_base = (
        PATTERN_TABLE_1_ADDR
        if self.ppu.ctrl & CTRL_SPRITE_PATTERN_TABLE
        else PATTERN_TABLE_0_ADDR
    )

    pattern_table = bytes(
        self.ppu.ppu_bus.read(pattern_table_base + offset)
        for offset in range(0x1000)
    )

    return composite_background_and_sprites(
        background=background,
        oam=self.ppu.oam,
        pattern_table=pattern_table,
        sprite_palettes=sprite_palettes,
    )

Límite importante

Console puede llamar a helpers de renderizado puros. Console no debe importar pygame.

Fuera del alcance

  • sprite 0 hit
  • sprite overflow
  • sprites 8x16
  • comportamiento del bit de prioridad sprite/fondo
  • visualización con pygame

Ejecutar esta lección

uv run pytest tests/chapter_09_sprite_rendering/test_308_console_render_framebuffer.py -v