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