在用 Rust 重构其 JavaScript 引擎解析器时,作者发现了一个罕见的编译器错误:Rust 编译器(`rustc`)中一个“p-critical, i-miscompile”级别的错误。 问题出现在作者优化 `consume_test` 方法时,他将标准的条件分支比较改为了 `bool as u32` 强制类型转换并随后进行加法运算。解析器随即无法处理简单的 for 循环。在检查了生成的汇编代码后,作者发现编译器实质上“吞掉”了一个必要的增量操作,违背了代码逻辑。 由于怀疑是真正的编译错误而非用户代码问题,作者创建了一个最小复现用例并提交了错误报告。Rust 社区反应迅速,该问题被确认为关键错误,团队成员在 18 小时内编写并合并了修复程序。这次经历凸显了一个罕见的事实:即使在内存安全的语言中,编译器错误也可能破坏程序员与语言之间的契约。最终,作者成功指出了编译器的一个缺陷,证明了有时候,“真的是编译器的问题”。
该项目为 Apple Silicon Mac、iPhone 和 iPad 带来了《命令与征服:将军 – 零点行动》的原生性能。通过将 2003 年原始引擎源码编译为 ARM64 架构,并利用转换层(DXVK/MoltenVK),游戏无需模拟即可运行。它还针对移动端优化了触控操作,包括框选和双指缩放功能。
此版本基于 EA 开源的源码,并在 *GeneralsX* 移植的基础上增加了对 iOS/iPadOS 的支持以及关键的引擎修复。请注意,**不包含游戏资源文件**;用户必须拥有正版副本(例如通过 Steam),才能下载必要的数据。
该项目提供了适用于 macOS 和 iOS 的完整构建脚本,需要 Xcode 和特定的开发工具。尽管该移植版功能完善,但仍处于持续开发中,已知在 iOS 长时间运行期间存在内存管理方面的局限性。详细文档(包括技术“移植指南”和 AI 辅助开发过程的完整工程日志)可在仓库中查阅。
**核心资源:**
* **源码:** [GitHub - Generals-Mac-iOS-iPad](https://github.com/ammaarreshi/Generals-Mac-iOS-iPad.git)
* **需求:** 原始游戏资源(需拥有 Steam 版)。
* **鸣谢:** 由 Ammaar Reshi 使用 Claude Code 工程化开发。
在开发 Game Boy Advance 游戏时,可以使用 mGBA 的内存映射日志寄存器来实现类似 `printf` 的调试功能。通过向特定的内存地址(`REG_LOG_ENABLE`、`REG_LOG_BUFFER` 和 `REG_LOG_SEND`)写入数据,你可以将调试信息直接输出到模拟器的日志窗口或终端。
要实现此功能,请创建一个辅助函数,用于格式化信息并将其写入这些寄存器。为方便起见,你可以结合 `vsnprintf` 来支持标准的 C 语言格式化(例如 `mgbalog(DEBUG, "x=%i", x);`)。
由于记录日志会产生性能和内存开销,因此应将其从最终版本中排除。你可以通过将日志实现代码包裹在 `#ifdef MGBALOG` 代码块中,并为 `mgbalog()` 函数使用预处理器宏来实现这一点。这样,你既可以在代码库中保留日志调用,又能确保在禁用 `MGBALOG` 标志时将它们完全从编译中剔除。这种简单的设置可以显著简化调试过程,且不会影响游戏的最终发布。
EndBASIC 0.14 现已发布,这是该项目迈向 1.0 版本的重要里程碑。与侧重性能的 0.13 版本不同,本次更新引入了多项旨在降低复古风格游戏开发门槛的新功能。
主要更新包括:
* **新图形功能**:添加了三角形、多边形和区域填充的图元,并附带了新的交互式演示。
* **复古美学**:全平台统一采用经典的 IBM VGA 8x16 字体替代了 TTF 字体,以增强一致性和“复古”感。
* **声音支持**:新增 `BEEP` 和 `SOUND` 命令,支持通过现有的控制台框架进行音频播放。
* **执行优化**:增强了对在类 Unix 系统上作为独立脚本运行 EndBASIC 程序的支持,并支持使用类似“Emacs 风格”的属性行在文件内配置控制台设置。
* **错误修复**:解决了 macOS 上 SDL 图形控制台的线程问题,修复了关键的启动崩溃故障。
尽管在 macOS 上的二进制代码签名方面仍存在挑战,但此次发布实现了该项目 2020 年的初衷:让用户能够以 BASIC 语言的简洁性来创作小游戏。用户可在项目的 `NEWS.md` 文件中了解更多详细信息。