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