前几个月在考古 CL 的游戏引擎时,无意间发现了 Kandria 这款从引擎到逻辑均使用 Common Lisp 编写的游戏,前几天也是在 Reddit 上得知游戏正式发售的消息。需要说明的是,本人并不怎么玩游戏,也不怎么关注游戏新闻,但这位独立游戏开发者以及游戏体现的一些技术还是颇具独特之处的,因为开发这款游戏使用到的包括引擎、图形界面、音频处理在内的外围库都是作者一个人从零使用 CL 编写的,并且基本以 Zlib 协议开源,可以单独用于其他的项目,凭一己之力极大地丰富了 CL 的生态(虽然与其他语言相比还是少得可怜)。这里简单地列举一些这款游戏的技术亮点:
- 使用 CL 实现的 2D 游戏引擎 ,使用 CFFI 访问 GLFW 与 OpenGL 图形接口。
- 使用 CL 实现的 Immediate Mode GUI 框架 ,可使用多种图形 API 作为渲染后端。
- 使用 CL 实现的实时音频处理框架,底层基于作者自己用纯 C 实现并绑定到 CL 的混音器。
- 使用 CL 实现的跨平台库用于访问游戏控制器,使用 CFFI 访问不同操作系统下提供的接口。
- 使用 CL 实现的矩阵运算库,似乎带有 SIMD 加速。
- 游戏数据、配置文件等均使用 Lisp 作为数据载体,秉承了 Lisp 代码即数据的思想(对应于 Emacs 里的
lisp-data-mode
)。
基本游戏(引擎)开发涉及的外围模块,这位作者能用 CL 的都用 CL 实现了一遍,值得一提的是这位作者也是 CL 里众多实现间可移植库的作者,还编写了我个人十分喜欢的单元测试与应用部署的框架,并且自己维护了一套 Quicklisp 发行版 ,总是基本是一人提供一套基于 CL 的应用/游戏开发全家桶。游戏的官网与 Github 仓库放在这,感兴趣的朋友可以支持一下。
17 个赞
看起来不错,操控也有点celeste的感觉,考虑支持一下
Common Lisp 相比 Racket 有哪些优点?
语言标准、性能、多范式、多实现、交互式编程、生态。具体优劣可以单独写一篇文章来讲了。
就racket那扶不上墙的性能,emm。哪怕原版 chez 性能都没 SBCL 好,racket 就更慢了
换了 Chez 后已经好了不少了,平均半个 SBCL 的性能,官方实现的性能还可以的正则表达式库是加分项,不过 Chez 开源后也没有什么实质性的优化与更新确实是比较遗憾的。
1 个赞
买了后发现用github上源代码跑不起来 似乎clear-color出错了, lisp只接触了皮毛,看不懂函数怎么调的,还在慢慢看
之前学 Common Lisp 用的 IDE 是 Portacle, 似乎也是她写的. 那个时候还没有开始正式使用 Emacs.
因为作者的 Trial 引擎一直在更新,如果买了游戏的话可以去 Discord 上问一问
加过discord了,不过lisp类还看不懂,等稍微熟悉下代码再问
我看discord上有人问能不能加上中文,作者说没有人力但欢迎社区贡献,不知道那个小伙伴弄了没;这边它的多国语言看上去ui是个键值对,任务对话是多选的,准备后面有空追追相关逻辑
LdBeth
12
保真么, scheme咋实现的都有, native的chez, vm的guile, 还有一堆compile to c的
LdBeth
14
都是开源的,你可以自己跑
compile to C 不代表性能就会好,也不代表就比 native codegen 差,用 byte code 倒是基本不快
sadhen
15
S7 Scheme靠谱不?打算all in S7 Scheme,不知道坑多不多
得看你的需求,嵌入在 C 应用程序中, S7 Scheme 是比较不错的,但一般会不可避免地编写一些 C 的胶水代码。至于是否 All in ,如果你想要尽可能地编写可移植的 Scheme 程序,那么 SRFI 的支持你也得看,不过 S7 Scheme 在 SRFI Table 居然榜上无名。
sadhen
17
SRFI我正在自己实现
这个没啥问题,我用xmake作者的tbox,C代码还行
作为主力的 Scheme 实现还是考虑 Chez 或者 Guile 吧,这两个算是 Scheme 实现里交互性比较好的,而且后面都有比较大的靠山,也是经过不少验证的, Chez 背后是思科和 Racket 开发者, Guile 背后是 GNU 。
sadhen
19
Chez和GNU Guile太大了,需要小巧的自己可控的Scheme解释器
LdBeth
20
s7 没你想像得那么小,编译出来也要 3MB,chez 也没你想的那么大,核心组件 libkernel.a
+ petite.boot
也是 3MB 不到这样,而且也是设计成能嵌入在其它应用里的。
s7 和标准 Scheme 最大的区別在没有 syntax-rules macro,只有类似传统 lisp 的 define-macro
。
因为它没 syntax-rules,也就是没实现完整的 R7RS/R5RS,也就是说 SRFI 的 reference implementation 很多都用不了