如何在 16 MHz 上运行 SimCity?
How to run a city builder on 16 MHz

现代硬件让我们习以为常,但 SimCity 曾在 Intel 386SX 的 16 MHz 处理器上流畅运行。分析 Micropolis 开源代码发现,核心在于 Simulate() 函数通过 mod16 参数,将交通、火灾、电力等模拟任务分散到多帧执行,而非每帧全量计算。这种“分帧处理”策略同样出现在 Assetto Corsa 的反射渲染和 Unreal 的 Lumen 光照系统中。它提醒我们:并非所有代码都需要每帧运行,巧妙的时间切片能让古老硬件焕发新生。
对于射击游戏来说,这种输入延迟显然是灾难,但对于城市模拟而言,它可能比即时反应感觉更好。
HN 评论区
19- prosaic-hacker
这个发现很棒,但这其实是一种古老得不能再古老的技术了。我大学毕业后第一份编程工作是在 CAE Electronics 做,那是一家飞行模拟器公司。当时的模拟器运行在各种小型机上,主要是 DEC Vax 780 及其后续机型,或者 Gould SEL(在我任职期间)。
如果记忆无误的话,模拟系统就像一个在微控制器上每 50ms 或 33ms 运行一次的超级循环。在每个循环中,调度器会运行一组核心模拟函数,有些每个循环都跑,有些则每隔 2 个、4 个或更多循环才跑一次。这套系统被称为“分带”(banding)。调度表会根据特定模拟器的需求重新设计以进行优化。
除了主 CPU 之外,还有各种外围设备也在进行计算优化。此外,随着系统速度变快,会多出一些时间让普通操作系统运行那些非实时要求的低优先级功能。
在我那个年代,这项技术并不新鲜,大约十年前上一代 Xerox 系统就已经在使用了。
- phire
> The original SimCity for example lists Intel’s 386SX as the CPU in it’s system requirements.
我不确定这个说法从何而来。原版游戏的包装盒 [1] 上写着它可以在任何拥有 512KB 内存的 PC 上运行。也就是说,它能在仅运行于 4.77 MHz 的 8088 处理器上跑起来。
但这远非该游戏最低配置的移植版。Commodore 64 版本可能缺失了不少功能(比如体育场、警察局/消防站和铁路),但主要的城市模拟循环确实存在于仅 64KB 内存和 1MHz 6502 处理器的环境中。
BBC Micro/Acorn Electron 移植版甚至更令人印象深刻。它基本具备完整版 Amiga/PC/Mac 版本的所有功能,唯独缺少音乐/音效/动画。它运行在 2MHz 6502 处理器(Electron 版为 1MHz)上,且仅占用 32KB 内存。
[1] https://images.launchbox-app.com/79861ce4-75ea-46dd-b46e-521...
- retrac
这让我想起了 Microcity,那是 Game Boy Colour 上的一个 SimCity 克隆版。
作者提供了一些关于设计细节的深入文档,解释了他们是如何让一个看起来相当生动的模拟系统运行在仅搭载 8 MHz 8 位处理器的机器上的。
https://github.com/AntonioND/ucity/blob/master/docs/index.rs...