Langjam Gamejam

发布: (2025年12月20日 GMT+8 21:56)
4 min read
原文: Dev.to

Source: Dev.to

第一天

Suicmez, the Language

Suicmez 采用了 PDD(panic‑driven development)方式开发。经过两次从零实现语言的速通——均使用 Rust——我在大约两小时内匆忙拼凑出一个词法分析器和一个解析器。实践确实有帮助,但项目的难度超出了预期。

Performance

对于任何非平凡的游戏来说,消耗数 GB 内存且只能跑到 2 FPS 的臃肿 DSL 是不可接受的。之前的速通使用了树遍历解释器(其中一个在运行后甚至获得了 JIT)。Suicmez 考虑了三种执行策略:

  • 字节码 VM
  • 使用 Cranelift 的 JIT
  • 编译到 C

同时还需要一个健壮的类型检查器;如果推断不足会迫使写入不必要的注解,而如果类型检查器过于复杂则会让项目无限期拖延。在完成类型检查器后,还必须实现运行时、内置函数以及 FFI 支持,才能开始任何游戏开发工作。

Hopium

意识到工作量对个人而言过于庞大,我开始寻找合作者。幸运的是,Nishi 加入了这个项目。

What We Did

我们讨论了整体计划以及编译器如何与系统的其他部分交互。Nishi 最初考虑使用他的图形库 Milsko,但所需的数学工作量过大,于是我们改用了 Raylib

Nishi 将游戏工作划分为三个部分:

  • 渲染
  • 碰撞
  • 网络

他还为游戏启动了一个网络库,libfishsoup

第2天

有史以来最棒的团队

Wildered 和 El1i0r 很快加入。

  • El1i0r 提供了深厚的 PLTDI 理论知识,帮助完善语言设计并纠正了之前的决定。
  • Wildered 构建了针对我们需求的分代垃圾收集器,并参与代码生成。

我们为语言和游戏设定了明确的目标。出于性能考虑,我们放弃了字节码 VM,而 JIT 的复杂性使我们转向 C 后端,成为“恰到好处”的解决方案。

第3‑4‑5天

我们决定做一个多人 3D FPS,最后存活的玩家获胜。

  • Wildered 的 GC 运行完美。
  • 我专注于 Suicmez 的标准库。
  • 项目使用 ODE 进行物理模拟,使用 Raylib 进行渲染。

回顾起来,我们后悔没有选择完整的引擎,但投入已经很深。

接近第 5 天时我们发现 Suicmez 的高级抽象阻碍了 C 互操作性,于是 Wildered 和我花了一晚添加低层特性。

我们的语言外观

位运算

固定数组

枚举

第6天和第7天

我们的目标是到第6天完成,但着色器错误导致工作延伸到第7天。

Terrain placeholder

地形最初呈现为绿色的斑块,但我们解决了该问题,游戏运行顺畅。在最后的15小时里,我们将游戏部署在 Nishi 的 VPS 上并准备提交。

我们在整个 jam 期间玩得非常开心,并以一次试玩环节收尾——虽然我们都认为游戏还有很多需要改进的地方。

Back to Blog

相关文章

阅读更多 »

仓库利用的权威指南

引言 仓库本质上只是一个 3‑D 盒子。利用率只是衡量你实际使用了该盒子多少的指标。虽然物流 c...