原版《帝国时代 2》开发者谈其汇编代码的使用
《帝国时代 II》的渲染核心中大量使用手写 x86 汇编——据说在 1999 年相较 C++ 带来了约 10 倍的速度提升——成为回顾游戏引擎曾经如何依赖底层优化以获取性能的切入点。评论者将那个时代与现代编译器、SIMD 内联函数、专用库和硬件视频解码进行对比,指出汇编如今仍在哪些场景中胜出、又在哪些场景里已基本被取代。伴随这些技术轶事(从 DirectDraw blit 到 VTune 调优)的,是对 1990 年代游戏开发文化的怀旧,包括 Usenet、IRC 交流,以及影响许多经典作品的面对面午餐讨论。
汇编在《帝国时代 2》和 1990 年代游戏开发中的作用
- 据说《帝国时代 2》通过用汇编重写绘制核心,让精灵绘制速度提升了约 10 倍。
- 在 90 年代末,把热点路径写成汇编、并在
#ifdef下保留 C/C++ 版本以保证可移植性,是很常见的做法。 - 那个时候,一些编译器——尤其是针对 SIMD 的编译器——生成的代码非常低效,使得手工调优的汇编明显更占优势。
- 如今,评论者表示编译器已经好得多;汇编主要只在少数情况下胜出(手动向量化、谨慎使用寄存器、利用特定领域的保证)。
SIMD、内联函数与性能调优
- 视频解码及类似负载仍然大量使用汇编或 SIMD 内联函数,并报告了数量级上的加速。
- 现代语言和运行时会暴露显式的 SIMD API,因为自动向量化的能力有限。
- 文中提到的工具包括:superoptimizer(例如一个基于 LLVM 的项目)、VTune、IACA、uiCA、llvm-mca。这些工具有助于分析流水线、停顿和调度。
- 几个轶事描述了费尽心力的手工优化最终却比编译器输出更慢,但也有少数 2–10 倍的收益,足以证明这份努力是值得的。
图形管线:DirectDraw、纹理与格式
- 《帝国时代 2》很可能使用 DirectX/DirectDraw 来呈现像素,并通过自定义代码处理可见性、精灵变换、镜像、抖点填充等。
- DirectDraw 在简单场景下提供了硬件加速的 blit,但驱动支持并不稳定,而且对小精灵还有开销。
- 讨论还涉及更利于缓存的纹理布局(块状/纹理“swizzling”)、mipmapping,以及关于 roto-zoomer 的经典 demoscene 资源。
- 有评论者指出,朴素的 SLP 精灵渲染非常慢,因此《帝国时代 2》的优化是合理的。
代码库、工具链与安全性
- 一条历史性说明称,某个重要的 Pascal/Delphi 编译器曾几乎全是汇编实现,后来因为变得无法维护而被重写。
- 据说《帝国时代 2:决定版》附带了一个可执行文件加壳器,会在运行时解密代码,使页面保持 RWX,这被批评为不安全。
补丁哲学与现代游戏更新
- 早期开发文化通常认为需要打补丁是一种失败;补丁很少见,且通过杂志分发。
- 这与现代动辄数十 GB 的大型平衡调整补丁形成对比,不过也有人认为在线游戏和不断变化的平衡确实需要持续更新。
社区、交流与怀旧
- 讨论中也争论了面对面午餐交流,是否比今天的 Discord/Slack/IRC 更能促进技术交叉融合。
- 有人认为现代在线交流的信息量丰富得多;也有人遗憾于碎片化、缺乏公共索引以及聊天动态过于浅层。
- 线程还提到《帝国时代 2》活跃的竞技场景、LAN 锦标赛,以及对这款游戏和 90 年代开发文化的强烈怀旧。