6 个版本 (3 个破坏性更新)
0.4.0 | 2024年5月3日 |
---|---|
0.3.0 | 2023年12月8日 |
0.2.0 | 2023年10月15日 |
0.1.2 | 2023年9月25日 |
#383 in 图形 API
每月162次下载
用于 comfy
495KB
11K SLoC
什么是 comfy
?
目前 Comfy 的 master 分支上有许多尚未发布的性能改进。如果您在性能上遇到困难,请考虑使用 master 分支。更多信息可以在 变更日志 中找到。
如果您是新手,请查看我们博客上的 Comfy 宣布 和 v0.2 版本发布宣布。
Comfy 是一个用 Rust 编写的有趣的 2D 游戏引擎。它旨在具有明确的观点、高效率和易于使用。它使用 wgpu 和 winit,这使得它是跨平台的,目前支持 Windows、Linux、MacOS 和 WASM。受到 macroquad、Raylib、Love2D 等许多其他引擎的启发,它旨在易于使用并满足大多数常见用例。
警告:Comfy 目前处于积极开发中。尽管已经有一些游戏正在使用 Comfy 开发,但 API 还未稳定,并且将会发生破坏性更改。如果您想使用 Comfy 开发游戏,可能需要深入挖掘源代码并可能手动进行调整。不过,源代码设计得简单且易于修改。如果您想制作游戏 jams,Comfy 已经足够成熟。
comfy
被命名为 comfy,因为它非常易于使用。
use comfy::*;
simple_game!("Nice red circle", update);
fn update(_c: &mut EngineContext) {
draw_circle(vec2(0.0, 0.0), 0.5, RED, 0);
}
comfy的最终目标是尽可能简单、直接地完成明显的事情,避免不必要的仪式。如果某物使用起来令人烦恼,那么它就是一个需要修复的bug。我们并非一定要追求对初学者的友好性,而是注重高效和人性化的API。如果你是初学者,comfy应该容易上手,但它可能没有其他替代品那么完善。comfy的目标最终不是打磨,也不是API的整洁、设计简洁、类型安全、可扩展性或最大功能。它是一个让你可以制作游戏的引擎。
没有任何东西从根本上阻止comfy成为一个3D引擎,但我们最不想做的事情就是与rend3或bevy在PBR精度或骨骼动画方面竞争。comfy不是在与Unreal Engine 5竞争。如果能够最终制作出简单的、风格的、3D的游戏将是非常棒的,但我们首先想完成2D的基本构建块。comfy的一些内部功能(批处理和Z轴排序)需要重新实现,以便支持这一点以及最终更高效的渲染技术,但这不应以牺牲API的清晰性和大多数游戏的易用性为代价。
特性
- 简单且高效的API。
- 精灵、文本和形状的即时模式渲染,带有自动批处理。如果你想画一个圆,你只需调用一个函数
draw_circle
。 - 带有HDR、色调映射和泛光效果的2D照明。
- 内置对z-index的支持,这意味着你不必担心绘制调用的顺序。
- 内置对egui的支持。
- 支持大多数图像和音频格式的并行资源加载。
- 没有复杂的ECS或抽象需要学习。只需构建你的游戏,让comfy为你解决问题。
- 使用kira进行简单的音频。如果你想播放声音,只需调用一个函数
play_sound
。 - 简单的2D摄像机。
- 粒子系统,包括单个粒子和具有许多选项的系统。
- 带有自定义网格和滚动纹理的尾迹。
- 文本渲染(目前使用egui)。
- 大量用于常见任务的实用工具。
设计目标与哲学
- 高度重视人性和效率。
- 没有魔法。代码就是它看起来那样做的。
- 针对简单游戏,目前仅支持2D。
- 有见地的默认设置。
- 几乎所有事物都使用简单的即时模式API。
- 当你需要更多时,会公开内部功能。几乎所有结构字段都是公开的,comfy不会让用户远离其功能。
- 合理的编译时间。comfy的编译速度比macroquad慢,但我们希望避免事情失控。最终用户不需要使用任何宏来使用comfy。
- 全局变量很方便。comfy使用了很多全局变量。
- 输入更少更方便。comfy有一个单一上下文对象,它被传递到各个地方。
- 约束很有用。comfy希望被用于许多游戏,但不是所有的游戏。
RefCell
很有用。comfy大量使用它们来处理部分借用。我们多次尝试在没有它们的情况下完成工作,那更痛苦。
非目标
- AAA 3D支持。虽然完全可能扩展渲染器来处理3D,但这尚未进行。3D模型、材质、骨骼动画等带来了许多复杂性。comfy可能会在未来支持简单的3D游戏,但这极不可能与大型3D引擎竞争。我们希望在添加更多复杂功能之前,确保我们拥有的功能工作良好且可使用。
- 基于ECS的引擎。虽然Comfy集成了hecs并提供了一些使用它的辅助工具,但这并不是必需的,甚至对于大多数情况来说也不是最优选择。
- 模块化。Comfy不是一个模块化引擎。它是一个具有默认设置的倾向性工具包,这些设置对于大多数游戏来说是合理的。没有计划实现插件系统或用其他东西替换wgpu。
- 最大性能。Comfy并不是设计成最快的引擎。为了提高舒适性和易用性,做了许多权衡,其中一些影响了性能。如果你正在寻找绘制一百万个四边形的最快方式,Comfy不适合你。但是,如果你有真正的使用场景,性能不够好,请提出问题。在性能方面有很多低垂的果实,但由于开发是由实际使用驱动,除非在游戏性能分析器中出现,否则不太可能进一步优化。
入门指南
仓库中的comfy/examples
文件夹下包含许多示例。尽管目前没有文档,但API足够简单,只需阅读示例就能理解。
为什么选择Comfy而不是X?
macroquad
在我开始开发Comfy之前,我使用macroquad来制作我的游戏。它运行得很好,但有一些功能缺失,最重要的是RGBA16F纹理,这是OpenGL 3.x的一个特性,没有它HDR就变得不那么可能。这是因为macroquad旨在针对较旧的GLES版本以实现更好的跨平台支持。虽然这对许多用例来说很棒,但当时我非常想尝试HDR、模糊和色调映射,这让我走上了wgpu的道路。
Comfy的第一个版本实际上具有与macroquad几乎相同的API,我基本上复制粘贴了函数定义,并在wgpu的基础上实现了大部分功能。随着时间的推移,我意识到我想要一些额外的东西,比如内置的z-index,这样我的游戏代码就不必担心绘制顺序。
如果你喜欢Comfy的理念,但它的稳定性不足以满足你的需求,我非常推荐你尝试使用macroquad。虽然它并不完美,但它帮助我构建了许多小型游戏,最重要的是,我在制作它们的过程中非常愉快。
comfy
和macroquad
之间的差异
Macroquad是Comfy最大的灵感来源,因此它们有很多相似之处,但也有不少差异。
坐标系
- Macroquad的坐标系是位于左上角的
[0, 0]
,y轴向下,以像素为单位。 - Comfy的坐标系是位于中心的
[0, 0]
,y轴向上,以世界单位为单位。默认相机缩放设置为30
world units。在一个像素艺术游戏中,使用16x16精灵时,你理想地应该设置相机的缩放,以便每个精灵是1
world unit。
内置Z-index。在macroquad中,绘制调用按照调用的顺序发生。在comfy中,几乎所有东西(除文本和UI外)都接受一个z_index: i32
。这意味着您不需要自己排序调用,comfy会为您完成,同时在尽可能好的情况下批处理绘制调用。
HDR渲染纹理:macroquad针对GLES2/3支持尽可能多的平台,因此它无法支持RGBA16F纹理。comfy针对桌面和WASM通过WebGL 2,两者都允许f16
纹理,因此所有渲染都使用HDR进行,并相应地进行色调映射。这使得我们的辉光实现可以基于HDR颜色工作,并且大大简化了与灯光的工作,因为光照强度可以远远超过1。
内置功能:comfy包含许多macroquad没有的额外功能,例如,egui本身就是comfy的一部分,并且很可能会保持这种状态,直到出现更好的替代品。macroquad和miniquad提供小的灵活的构建块,而comfy旨在成为制作游戏的全套且相对有观点的方法。
还有很多细微的差别,但原则上您可以认为comfy是“内置更多功能的macroquad,建立在wgpu之上,跨平台功能较少”。请注意,由于comfy建立在wgpu之上而不是OpenGL,我们无法像GL那样进行即时模式交互。这使得某些事情变得更加困难,例如渲染目标、更改着色器统一变量等。
comfy打算支持所有这些功能,但这需要更多的开发。许多引擎(例如bevy和rend3)最终使用渲染图来将渲染逻辑暴露给用户。虽然这些非常灵活并且提供高性能,但它们的API并不简单。
鉴于我们的意图不是支持AAA图形,目标应该是找到某种形式的中间地带,在那里我们可以在API简单性、表达性和乐趣方面实现类似于macroquad的东西,同时利用wgpu提供的全部功能。
comfy的最终设计目标是,其大多数API仅通过查看类型签名即可理解,无需深入研究文档,也没有过多的陷阱。
rend3
我除了略微浏览了一下它的代码之外,没有太多关于rend3的经验,但作为一个3D渲染器,它与comfy填补了非常不同的细分市场。如果您正在构建一个3D游戏并且不想进行PBR渲染,rend3可能是您想要考虑的东西。
Fyrox
Fyrox似乎试图直接与Unity、Godot和Unreal竞争,目前是唯一一个功能齐全的Rust游戏引擎,值得注意的是,它还包括一个完整的3D场景编辑器。其3D演示尤其令人印象深刻,如果您正在寻找一个功能齐全的3D引擎,那么它肯定是一个值得考虑的选择。
尽管如此,comfy毫不犹豫地专注于简单的游戏,因此与Fyrox填补了非常不同的细分市场。
bevy
Bevy是“大型Rust游戏引擎”竞争者之一。在2D功能方面,Bevy在社区规模和整体crate支持和模块化方面确实胜出,但这是comfy甚至不试图竞争的领域。comfy旨在具有观点、简单和实用,而Bevy的目标是模块化、可扩展,并建立在全面的ECS之上。
由于其模块化,Bevy通过社区资产crate提供了许多更多功能,这大大扩展了它,但也拥有一个相对分散和不稳定的生态系统。
comfy的目标在很多方面是相反的。目标是提供一个简单、稳定和实用的基础。comfy不是用于实验Rust的类型系统、ECS或其他抽象的平台。它是一个用于制作小型游戏的工具包。
您在comfy中找到的唯一功能是那些可以立即使用、理解和从第一天开始工作的功能。如果一个功能在真实游戏中没有被使用,它就不会出现在引擎源代码中。
godot-rust
如果目标是“真正制作一款游戏”,特别是在3D领域,那么godot-rust很可能就是最佳选择。没有任何Rust引擎能比得上Godot所提供的功能,而且在使用godot-rust制作BITGUN的一年时间里,我们可以肯定它非常成熟、稳定且维护良好。
然而,最大的好处(Godot)也是我们最大的缺点。我们发现基于代码的框架使用起来更加有趣。许多人认为GDScript是Godot中存在问题的一部分,但在BITGUN的开发过程中,它实际上帮了我们很多忙,因为有许多事情“只需要几行代码”就可以完成,并不真正需要使用Rust。
特别是如果你正在考虑制作3D游戏,godot-rust可能是帮助你成功发布的最佳选项。
ggez
ggez是那些存在已久的库之一,但我从未真正有机会使用它。它似乎与维护者流失有着一定的历史渊源,这就是为什么我从未使用过它,因为我两次在Rust中切换框架/引擎时,它都处于无人维护状态。尽管在当前版本中,它已经升级到了基于wgpu的后端,但我不敢评论其质量。我想象它可能是macroquad的一个很好的替代品。
Rust中还有很多其他的框架/引擎,但我还没有机会以任何有意义的方式与之互动,因此它们没有包含在这个比较中。
路线图
以下目标没有特定的顺序,但应该很快就会实现。Comfy不是一个需要两年才能出现的虚幻项目。这里只列出了需要最多几周工作时间的功能。
- 改进光照。目前我们有2D光照,但它们很基础,在某些情况下显得很丑,而且不够灵活。
- 可配置的辉光。目前辉光是硬编码的,以简化一些事情,并且始终启用。我们不想为了解决这个问题而延迟发布,因为这确实让游戏看起来更好,但这是v0.1发布后首先需要解决的一些问题之一。
- 可配置的后期处理。
- 自定义着色器和材质。
- 渲染目标。
- 游戏手柄和触摸板支持。
- 抗锯齿。
- 带有柔化阴影的2D阴影投射器。
- 无需
include_dir
的资产打包。目前Comfy依赖于其内置的include_dir
使用(一个带有一些额外功能的较小分支),或者用户手动处理资产加载。还有许多其他打包资产的方法,支持这些方法将很酷,但我们目前没有这样做,因为在合理的大小(<1GB)的资产中,include_dir
已经足够好。 - 无需egui的文本渲染。目前所有文本(使用
draw_text
和类似方法绘制)都是使用egui
的画家在单独的一层上渲染。这为我们提供了许多文本渲染的功能,但也带来了一些限制。目标是仅在wgpu上实现文本渲染。我们尝试了几种不同的方法(例如glyphon
),但最终发现没有一种方法足以简单地替换我们在egui
中的实现,而且由于没有游戏因更灵活的渲染而被阻止,这仍然是一个相对较低优先级的问题。 - 整体引擎/渲染器代码清理。Comfy中的代码并不美观,因为它是在构建多个游戏的过程中有机发展的。有一些功能可以更好地暴露,还有一些是我们游戏需要的残留部分。提供的示例应该作为确保Comfy足够灵活的基础,但改进代码库是一个持续的努力。话虽如此,你可以在Comfy中找到的几乎所有东西都应该在合理的程度上工作。
- 减少重借和
RefCell
。目前我们几乎用很多的RefCell
来处理几乎所有的东西。虽然这在一些地方有帮助,但还有很多地方不需要这样做,并且我们在每一帧中过度借用和重新借用多次。目前我们没有注意到这影响性能,但这应该被清理。还有一些东西不必要地使用了Mutex
。
尽管Comfy已经可以使用,但代码库远未完善。随着我们开发游戏,引擎迅速发展,有许多部分可以改进,并将被改进。Comfy在不是100%完美之前就已经发布,因为即使在其当前状态下,它也可以很好地用于制作2D游戏。
您可能会遇到一些奇怪的问题,一些内部计划重新制作,但任何由示例涵盖的内容都应该100%正常工作。我们已经内部使用Comfy超过6个月,其大部分代码库已从我们之前的基于OpenGL的引擎移植过来。这并不意味着引擎已经成熟,但我们已经有真实玩家玩过我们用Comfy制作的游戏。
贡献
Comfy仍然处于生命周期的早期。虽然它已经被用来制作游戏,但到目前为止只有少数人使用过它,甚至看到过源代码。最好的贡献方式是使用Comfy并报告您发现的任何问题。
代码库并不整洁。Comfy的目标不是成为最漂亮的代码库。许多事情可能不是最优的,对于其中一些事情,开放讨论是有意义的。但仅仅重格式化代码、移动东西或进行某种重组的拉取请求可能会被拒绝,除非之前有讨论。
如果您发现任何不符合预期的情况,请提交问题。Comfy旨在成为那些想制作游戏的人的富有成效和舒适的伴侣。
如果您觉得某些东西不够舒适,或者您有一个想法,可以使它更加舒适而不牺牲太多,请提交问题。
如果您真的只想提交一个拉取请求来贡献一些东西而没有先前的讨论,最好的地方是示例。简单和高级示例,以及小型示例游戏都欢迎。
由于开发节奏快,Comfy目前不追求大量的文档覆盖。示例比文档更受欢迎,因为当API更改时它们更容易修复。大多数事情应该是自我解释的。
如果您想讨论与Comfy相关的内容,请加入我们的Discord服务器。
许可
Comfy是免费和开源的,并且根据MIT和Apache 2.0许可证双许可。
使用Comfy的游戏
LogLog Games正在使用Comfy,已发布一款游戏在Steam上,名为Unrelaxing Quacks - 快速的幸存者!
我们还使用Comfy在一些小型游戏中,例如我们的1-bit jam参赛作品,我们在其中实验了CPU纹理和2D光线追踪。
Comfy通过JetBrains的开源计划和支持其开发许可证得到了JetBrains的支持。
依赖关系
~36–75MB
~1.5M SLoC