8 位机游戏优化的疯狂技巧

A great old-timey game-programming hack (2013)

多年前,我在大学时期曾参与过 8 位 PC 时代的电脑游戏开发。那时硬件性能极弱,程序员们不得不施展各种疯狂技巧来提升游戏速度。我的一位朋友几乎完成了一款图形惊艳的街机风格横版游戏,但游戏运行太慢,画面卡顿严重。他的代码已经优化到极致,循环展开、冗余消除都已完成,却依然不够快。我起初以为无法再优化,但后来在查阅 MC6809 处理器手册时,发现了一个疯狂的思路:用精确偏移替代自增操作,大幅减少指令周期。最终,这段代码将每行绘制时间从 157 个周期压缩到 98 个,整体速度提升 60%。虽然仍不够完美,但这正是那个时代程序员们用智慧对抗硬件极限的缩影。

在那个年代,如果你想往屏幕上画点东西,就得自己一个字节一个字节地动手,没有纹理映射器,也没有位块传输,只有字节,而且还得你自己搬。
  1. taspeotis

    6502 有一个比 6809 的 PSHS 技巧更窄、更阴险的版本。BRK 指令在三个连续周期内将 PC 和状态寄存器压入堆栈,它几乎是唯一一个非中断指令中写入次数超过两次的指令。

    > Atari 2600 有水平对象计数器,你不能直接设置它们,但当你写入时它们会锁存,并将对应的对象设置为该周期光束的 X 位置。《Pole Position》需要这三个对象来绘制道路的左右两侧和中心线,它们应该在地平线处汇合。

    > 但光束每 CPU 周期向右移动 3 个像素,如果用 STA 写入,会导致每个对象之间相隔 9 个像素。怎么办?将堆栈指针移动到对象指针所在的位置(2600 将堆栈映射到零页,即 RAM 和寄存器所在的地方),然后调用 BRK,确保 BRK 向量将你返回到下一条指令。由于对象指针是相邻的,BRK 会在连续周期内写入每个对象指针,现在它们之间每个相差 1 个周期 = 3 个像素。

同日更多故事

2026-11-11