过去两年,Charles Zhang 和 shinmera 一直在努力将 shinmera 的游戏引擎 Trial 运行在 Nintendo Switch 上,主要挑战是将底层 Common Lisp 运行时移植到该平台。
- 当前状态:已将运行时和编译器移植到可在 Switch 上直接编译和执行任意 Lisp 代码的程度,能与共享库交互并移植了 Trial 所需的各种操作系统可移植性库,如照片所示 Trial 的 REPL 示例可在 Switch devkit 上运行,但不久后 SBCL 尝试启动垃圾回收时会崩溃,还无法输出音频,可能存在其他性能问题。shinmera 一直在每月支付 Charles 为移植工作投入的时间成本,约 17000 美元,而他自己的收入来自 Kandria 的销售和 Patreon、GitHub、Ko-Fi 上的捐赠,一个月好的时候约 1200 美元,差的时候约 600 美元,在瑞士生活很艰难。由于游戏制作成本高,shinmera 难以决定如何分配有限资源,这个 Switch 移植项目可能会被放弃,因此呼吁大家在 Patreon、GitHub 或 Ko-Fi 上支持他。
- 概述:Switch 的环境是用户代码在带有四个核心和 4GB RAM 的 ARM64 Cortex - A57 芯片上运行,基于最初为 Nintendo 3Ds 开发的专有微内核操作系统。SBCL 已有 ARM64 Linux 端口,Kandria 也适合 4GB RAM,移植难点在于与 Switch 的专有操作系统接口,幸运的是 Switch 支持 Trial 基于的 OpenGL 图形库,移植到其他图形库工作量大。为开始开发需先获得访问权限,购买约 400 美元的 devkit 且其 SDK 仅在 Windows 上运行。
- 构建 SBCL:SBCL 主要用 Lisp 编写,有小的 C 运行时,需另一个 Lisp 实现来引导,构建过程大致分五个阶段,在目标机器上运行 Lisp 代码是关键,部署应用类似。在 Switch 上构建有困难,其无通常的编译环境和可执行页面,但大部分代码可按通常方式为 ARM64 编译,只需确保与周围环境接口的代码知道是为 Switch 编译。
- 为 Switch 构建:步骤包括为 Switch 构建配置、获取不同的头文件、使用 Nintendo SDK 的 C 编译器编译、创建特定的 ARM64 Linux 系统等,解决了编译代码的问题,但还需解决在 Switch 上启动代码的问题,利用 SBCL 的 immobile - code 和 elfination 功能,将生成的代码转换为可执行的代码和数据部分,构建过程复杂,需至少一个 ARM64 Linux 机器和 AMD64 Windows 机器或 AMD64 Linux 机器加 Wine。
- 垃圾回收器:SBCL 的标准垃圾回收器是“gencgc”,在 Switch 上因多线程而复杂,在 Unix 系统可用信号机制,Switch 无信号机制需使用“safepoints”策略,修改编译器插入额外代码检查线程是否应暂停,当前的 safepoint 系统是为 Windows 编写,在 Switch 上需插入更复杂的检查,且 CLOS 存在问题,目前依赖快速求值器,这引出未来工作。
- 未来工作:理想是探索冻结 CLOS 并提前编译的选项,调查 Charles 恢复的块编译模式,Switch 性能可能迫使优化引擎和 Kandria 代码,还需让垃圾回收器完全运行、恢复 C 回调功能,以及处理其他未立即关注的问题和在 Trial 中添加额外的可移植性功能。
- 结论:若移植状态有重大变化会添加附录,由于 NDA 无法公开所有工作,只能上游和公开部分内容,会在 Patreon 每月更新中告知进展,再次呼吁大家支持。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。