309. Main 使用完整帧缓冲

从 main_only_background.py 创建 main.py,并使用 Console.render_framebuffer()。

309 / 356 · tests/chapter_09_sprite_rendering/test_309_main_uses_full_framebuffer.py

涉及的文件

main_only_background.py
main.py

为什么需要这一步

main_only_background.py 保留了之前那个只显示背景帧缓冲的手动运行脚本。这一步中,先把该文件复制为 main.py,然后在其中应用完整画面渲染的修改。

Console 现在暴露了 render_framebuffer(),它会在一个纯 Framebuffer 中返回背景 + 精灵。新的 main.py 应该使用这条完整画面渲染路径,而不是旧的仅背景辅助函数。

模板文件 main_only_background.py 显示的是:

console.render_background_framebuffer()

把它复制为 main.py 并应用这一步之后,main.py 显示的是:

console.render_framebuffer()

这样,当当前 PPU 状态包含有效的 OAM、CHR 和精灵调色板数据时,手动运行的 pygame 窗口就能显示出诸如马力欧/敌人/道具之类的精灵。

建议的实现流程

cp main_only_background.py main.py

然后更新 main.py,让这一行:

framebuffer = console.render_background_framebuffer()

变成:

framebuffer = console.render_framebuffer()

在创建 pygame 窗口之前和每次帧步进之后都要这样做。

重要的保留规则

不要删除 main_only_background.py。较早的教程测试会用它作为仅背景运行脚本的稳定历史检查点。

已知的视觉局限

精灵可能会错误地出现在水管前面。目前这是预期行为,因为精灵/背景优先级第 5 位虽然已被解码,但尚未被应用。接下来计划要做的工作是背景不透明度掩码以及支持优先级的合成。

手动命令

uv run python main.py

预期的手动运行表现

pygame 窗口应该仍然显示背景,并且现在应该出现精灵。视觉上的优先级可能仍然不对。由于当前的 pygame 绘制辅助函数是特意写得很简单,性能也可能仍然较慢。

本步骤不涉及的内容

  • 背景不透明度掩码
  • 精灵/背景优先级行为
  • sprite 0 hit
  • sprite overflow
  • 帧缓冲快速上传优化
  • 从 pytest 中调用 main()

运行本课

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