文章摘要
文章探讨了《过山车大亨》游戏的优化技术,称其为程序优化的黄金标准,并提到作者有幸在德国知名游戏播客中分享相关见解。
文章总结
优化典范:《过山车大亨》的技术内幕
《过山车大亨》及其续作常被誉为优化最出色的游戏之一,由克里斯·索耶(Chris Sawyer)几乎完全用汇编语言编写。这款游戏在1999年的硬件上流畅模拟了拥有数千游客的完整主题公园,即便在今天,许多同类建造游戏仍难以保持稳定的帧率。
汇编语言的优势
游戏采用低级的汇编语言开发,这在当时能比C或C++等高级语言实现更高性能。虽然汇编曾是游戏开发的标准,但在《过山车大亨》开发时已逐渐被放弃。例如,早六年发布的《毁灭战士》已主要使用C语言编写。尽管难以量化汇编带来的具体性能提升,但它在当时的影响可能比现在更大,因为现代编译器已能更好地优化高级代码。
代码优化实例
尽管源代码未公开,但开源项目OpenRCT2通过逆向工程实现了近乎原版的复刻,揭示了以下优化技巧:
动态数据类型选择
根据数值范围选择存储类型。例如,公园总价值使用4字节变量,而商品价格仅需1字节。OpenRCT2已将其统一为8字节变量,因现代CPU不再受此影响。位运算替代数学操作
游戏广泛使用位移操作(如<<和>>)替代乘除,例如OldValue << 2等价于OldValue * 4。这种优化要求公式设计时优先使用2的幂次方数值,体现了开发中对性能的极致追求。
游戏设计优化
克里斯·索耶身兼程序员与设计师的双重角色,使得游戏机制与性能深度结合:
游客路径寻优
游客并非主动寻找目标设施,而是随机游走,仅在遇到设施时触发互动。这种设计避免了大规模实时路径计算,仅对关键行为(如机械师维修或离园)使用有限深度的传统寻路算法。例如:- 默认寻路深度为5个路口。
- 购买地图的游客深度提升至7。
- 机械师的深度为8,确保其优先完成任务。
拥挤处理简化
游客间无碰撞检测或避让逻辑,但密集人群会降低满意度并触发投诉。这种设计以极低计算成本实现了拥挤反馈,避免了复杂的物理模拟。
启示
《过山车大亨》的成功证明,通过技术与设计的协同优化,可在有限硬件条件下实现卓越性能。现代开发中,这种紧密协作虽更具挑战,但仍是突破性能瓶颈的重要思路。
(原文链接:Larst Of Us)
评论总结
评论总结:
- 对RCT用汇编开发的惊叹
- 认为用汇编开发RCT是"monumental and impossible"的任务
- "I had always heard about how RCT was built in Assembly, and thought it was very impressive"
- 推荐相关阅读资料
- 提供了多个关于RCT的采访和文章链接
- "Fun read, thx! I'd also recommend more about RCT"
- 关于编译器优化的讨论
- 质疑文章观点,认为现代编译器会优化乘除法
- "What language is this article talking where compilers don't optimize multiplication"
- "modern compilers will implement division by a power of two as a shift"
- 人类优化 vs 编译器优化
- 认为人类可以打破抽象层进行优化,编译器做不到
- "human can decide when the abstraction layers should be deliberately broken"
- 游戏设计中数值特性的重要性
- 认为优秀设计师仍需要考虑数值特性
- "Numeric characteristics are absolutely still a consideration"
- 位移操作的注意事项
- 指出位移操作在负数情况下的问题
- "this doesn't work if the value is negative"
- 游戏优化案例分享
- 提到Factorio游戏的优化技巧
- "simplify it to just be only the entry and exit tile are actually active"
- 对过早优化的幽默提醒
- 用"存储两位数年份"的例子调侃过早优化
- "Don't preoptimize!"