🎢 The gold standard of optimization
游戏开发
性能优化
汇编
经典游戏
背景
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 可能是这种优化方法的"完美风暴",但并不意味着现在不能这样做。只是需要程序员和游戏设计师之间更多的对话,以及对技术挑战说"不"的勇气。