270. 帧缓冲区的数据形状

为渲染管线创建纯粹的帧缓冲区数据形状。

270 / 356 · tests/chapter_05_rendering_pipeline/test_270_framebuffer_data_shape.py

需要创建的文件

emulator/rendering/
emulator/rendering/framebuffer.py

此步骤存在的原因

第 7 阶段首先要定义模拟器核心为视觉输出所生成的数据形状。这应该是纯粹的 Python 数据,而不是 pygame 专属的数据。

什么是帧缓冲区?帧缓冲区是表示一整幅图像/一帧画面的像素数据块。

最小示例

A 256x240 NES framebuffer contains:

    256 * 240 = 61440 pixels

每个像素用一个 RGB 元组表示

    (red, green, blue)

示例

    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)

常见误解

帧缓冲区并不等于 pygame 窗口。帧缓冲区是模拟器核心的数据。之后 pygame 可以用它来显示画面,但创建或测试帧缓冲区并不应该依赖 pygame。

建议的实现示例

from dataclasses import dataclass, field

RGBColor = tuple[int, int, int]

NES_SCREEN_WIDTH = 256
NES_SCREEN_HEIGHT = 240
BLACK: RGBColor = (0, 0, 0)


@dataclass
class Framebuffer:
    width: int = NES_SCREEN_WIDTH
    height: int = NES_SCREEN_HEIGHT
    pixels: list[RGBColor] = field(default_factory=list)

    def __post_init__(self) -> None:
        if not self.pixels:
            self.pixels = [BLACK] * (self.width * self.height)

        if len(self.pixels) != self.width * self.height:
            raise ValueError("Framebuffer pixel count must be equal width * height")

重要不变量

构造完成后

len(framebuffer.pixels) == framebuffer.width * framebuffer.height

不在本步骤范围内

  • get_pixel/set_pixel 方法,将在下一步测试
  • 坐标校验
  • RGB 分量校验
  • 把 NES 调色板索引转换为 RGB
  • 渲染 CHR/名称表数据
  • pygame/前端显示

运行本课

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