🎢 The gold standard of optimization

⭐⭐⭐⭐⭐ 5星 | 作者: Lars Thiessen | 来源: Hacker News
游戏开发 性能优化 汇编 经典游戏

背景

RollerCoaster Tycoon (1999) 可能是最后一款完全用汇编语言开发的大型游戏。在1999年的硬件上,这款游戏模拟了包含数千个代理人的完整主题公园,帧率稳定。至今许多类似建造游戏仍在为稳定帧率而挣扎。

1. 金钱数据类型优化

不同类型的金钱值使用不同的数据类型,基于该位置预期需要的最大数值:

  • 公园总价值 - 使用 4 字节(预期大数值)
  • 商店物品价格 - 仅使用 1 字节(数值范围小)

注:OpenRCT2 已移除此优化,因为在现代CPU上性能差异可忽略。

2. 位运算代替数学运算

代码中大量使用位运算代替乘除法:

value << 2 等同于 value * 4 value >> 1 等同于 value / 2

这不仅仅是"技术细节"——游戏公式特意设计为使用2的幂次方。想象一个程序员问游戏设计师:"你能把公式里的9.5改成8吗?因为CPU更喜欢计算这个数。"

在RCT中,设计师和程序员是同一个人:Chris Sawyer。

3. 为性能而生的游戏设计

游客AI:随机游走而非寻路

传统设计:游客先决定想去哪个设施,然后寻路前往。
问题:寻路是昂贵操作,对数千个代理同时运行极其困难。

RCT 的解决方案:游客在公园里随机乱走,"偶遇"感兴趣的设施。到达路口时,几乎随机选择新方向,只用少量规则避免死路。

即使游客抱怨饥饿和口渴,他们也不会主动寻找最近的食物摊——只是继续随机走,直到偶然经过食物摊。

4. 寻路限制:性能优先于完美

  • 默认限制:只搜索 5 个路口深度
  • 维修工:允许 8 个路口(更重要)
  • 买了地图的游客:允许 7 个路口

玩家可以在游客想法中看到寻路失败:"无法找到出口"。

5. 无碰撞系统

游客之间不碰撞,也不互相躲避。数千人可以占用同一路径格子。

但系统仍然跟踪附近人数——如果周围太多游客,会影响心情并产生抱怨。

结果对玩家来说是相似的(都需要规划布局避免拥挤),但计算量小了一个数量级。

核心洞察

"改变游戏设计来提升性能看起来是激进的一步,但如果做对了,能带来任何细致微优化都无法达到的收益。"

RCT 可能是这种优化方法的"完美风暴",但并不意味着现在不能这样做。只是需要程序员和游戏设计师之间更多的对话,以及对技术挑战说"不"的勇气。