Hacker News 中文摘要

RSS订阅

用Clojure开发太空飞行模拟器 -- Developing a Space Flight Simulator in Clojure

文章摘要

作者在2017年受到Orbiter 2016太空飞行模拟器的启发,开始开发自己的模拟器。最初使用C和GNU Guile进行原型设计,后来转向Clojure,因其多方法、快速哈希映射和向量等特性。经过近五年的开发,作者在Clojure中实现了3D渲染、大气层、阴影和体积云等复杂功能,并利用OpenGL Superbible学习相关技术。最终,Orbiter开源并发布在MIT许可证下。

文章总结

标题:使用Clojure开发太空飞行模拟器

主要内容:

作者在2017年受到当时专有的免费太空飞行模拟器Orbiter 2016的启发,决定自己开发一个类似的模拟器。最初,作者使用C语言和GNU Guile(一种Scheme实现)进行刚体物理和Wavefront OBJ文件的加载与渲染的原型开发。后来,作者转向使用Clojure,因为Clojure支持多方法、快速的哈希映射和向量操作,并且具有不可变值和安全的并行处理能力(通过atoms、agents和refs实现)。

开发过程中,作者首先攻克了3D渲染的难点,包括行星、大气层、阴影和体积云的渲染。为了理解OpenGL的功能,作者阅读了《OpenGL Superbible》。当Orbiter最终开源并发布在MIT许可证下时,作者发现其90%的代码与图形相关,因此从图形问题入手是一个正确的决定。

软件依赖: 开发过程中使用了多种软件库,包括Clojure编程语言、LWJGL(提供Java库的封装,如OpenGL、GLFW、Nuklear等)、Jolt Physics(用于模拟车辆和碰撞)、Fastmath(用于快速矩阵和向量计算)、Comb(用于着色器代码模板化)、Instaparse(用于解析NASA行星常数内核文件)、Gloss(用于解析NASA双精度数组文件)等。

大气渲染: 作者使用了Bruneton的预计算大气散射模型,通过多次数值积分计算2D透射率表、2D表面散射表、4D瑞利散射和4D米氏散射表。这些表在游戏启动时加载到OpenGL纹理中,并通过着色器函数进行插值和渲染。

行星渲染: 作者使用了NASA的Bluemarble、Blackmarble和Elevation数据,生成了多分辨率的地图瓦片。这些瓦片被组织成四叉树结构,并在运行时动态加载到OpenGL纹理中。

其他主题: - 太阳系: 作者根据Skyfield Python库实现了天文学代码,用于获取行星的位置和方向。 - Jolt绑定: 作者将Jolt Physics的函数封装为C函数,并通过Coffi库在Clojure中调用。 - 性能优化: 作者使用clj-async-profiler生成火焰图,并通过设置JVM的ZGC垃圾收集器来减少垃圾回收停顿。 - 项目构建: 作者使用tools.build构建项目,并通过Packr生成Linux可执行文件。

未来工作: 尽管大部分难点已经解决,但仍有部分功能需要完善,如控制面、推进器图形、发射台和跑道图形、音效、3D驾驶舱、月球和空间站等。此外,作者还考虑如何安全地支持游戏模组。

结论: 项目的源代码可以在GitHub上找到,目前仅有一个测试版本,但作者鼓励玩家在Steam上将其加入愿望清单以获取发布通知。

相关链接: - GitHub源代码 - Steam愿望清单

评论总结

评论内容总结如下:

  1. Guile与Clojure的比较

    • 观点:Guile具备多方法和快速哈希映射,但缺少动态向量;Clojure的数据结构更易用。
    • 引用:
      • "Guile has [multi-methods] and [fast hash maps], but not yet [dynamic vectors]."
      • "Clojure's data structures are easier to use, though."
  2. 视觉效果与功能需求

    • 观点:视觉效果出色,但希望增加更多功能(如对接功能)。
    • 引用:
      • "Beautiful visuals. I'd like something to dock with."
  3. 技术实现的独特性

    • 观点:未使用Unity或Unreal等标准游戏框架,令人印象深刻。
    • 引用:
      • "Wow, this is impressive not using standard gaming framework like Unity or Unreal."
  4. Malli实践示例的赞赏

    • 观点:Malli的实际应用示例非常出色。
    • 引用:
      • "This is awesome! Very nice example of malli in practice!"
  5. 对Jank的期待

    • 观点:期待Jank尽快成熟并在独立游戏社区中产生重大影响。
    • 引用:
      • "I just can't wait to see how Jank gets production-ready and absolutely blows the indie gaming community."
  6. 对Clojure生态系统的建议

    • 观点:建议尝试ham-fisted库,并推荐techascent和neanderthal库的性能表现。
    • 引用:
      • "Have you tried experimenting with ham-fisted? I've found the libraries in the techascent part of the Clojure ecosystem to be very good performance wise."
  7. 对博客文章的赞赏

    • 观点:博客文章内容精彩,表达感谢。
    • 引用:
      • "This was an amazing blog post, thank you!"

总结:评论主要围绕技术实现、功能需求、生态系统工具及未来期待展开,整体评价积极,同时提出了一些改进建议。