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日 |
#857 in 图形API
每月168 次下载
在 3 个 包中使用
265KB
6.5K 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。
- 并行加载资源,支持大多数图像和音频格式。
- 没有复杂的数据结构或抽象,只需构建你的游戏,让Comfy为你解决问题。
- 使用kira实现简单的音频。如果你想播放声音,就调用函数
play_sound
。 - 简单的2D摄像头。
- 粒子效果,包括单个粒子和系统,具有众多选项。
- 使用自定义网格和滚动纹理的轨迹。
- 文本渲染(目前使用egui)。
- 大量用于常见任务的实用工具。
设计目标和哲学
- 重点关注人体工程学和生产力。
- 没有魔法。代码做的是它看起来要做的事情。
- 针对简单游戏,目前仅支持2D。
- 有见地且实用的默认值。
- 几乎一切均采用简单即时模式API。
- 在需要时暴露内部功能。几乎所有结构字段都是公共的,Comfy不会将东西从用户那里隐藏起来。
- 合理的编译时间。Comfy的编译速度比macroquad慢,但我们希望避免事情失控。最终用户不需要使用任何proc宏来使用Comfy。
- 全局变量很方便。Comfy使用了大量的全局变量。
- 减少输入很方便。Comfy有一个单一上下文对象,它在各处传递。
- 约束条件很棒。Comfy希望被用于许多游戏,但并非所有游戏。
RefCell
很棒。Comfy使用它们来解决部分借用问题。我们尝试多次不使用它们,结果更痛苦。
非目标
- AAA 3D支持。虽然完全有可能扩展渲染器来处理3D,但这尚未有意为之。3D模型、材质、骨骼动画等带来了很多复杂性。Comfy可能会在未来支持简单的3D游戏,但它极不可能试图与大型3D引擎竞争。我们希望在添加更多复杂功能之前,确保我们拥有的东西能够很好地工作并且可用。
- ECS 基础引擎。虽然 Comfy 集成了 hecs 并提供了一些使用它的辅助工具,但这并不是大多数情况下必需的,甚至也不是最佳选择。
- 模块化。Comfy 不是一个模块化引擎。它是一个具有默认设置的具有偏见的工具包,这些默认设置对大多数游戏来说是合理的。没有打算拥有插件系统或用其他东西替换 wgpu。
- 最高性能。Comfy 并非设计为市面上最快的引擎。为了人体工程学和易用性,已经做出了许多权衡,其中一些影响了性能。如果你正在寻找绘制百万个四边形的最快方式,Comfy 并不适合你。然而,如果你有一个真正需要高性能的场景,请提交一个 issue。在性能方面有很多低垂的果实,但由于开发是由实际使用驱动的,除非在游戏中出现性能分析器中的问题,否则不太可能进一步优化。
入门指南
在 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
,这意味着你可以看到大约30
个世界单位。在一个 16x16 图标的像素艺术游戏中,你最好设置相机的缩放,使每个图标为1
个世界单位。
内置Z-index。在macroquad中,绘制的顺序与调用它们的顺序一致。在comfy中,几乎所有内容(不包括文本和UI)都接受一个z_index: i32
。这意味着您不需要自己排序调用,comfy会为您完成,同时在尽可能的情况下批处理绘制调用。
HDR渲染纹理:Macroquad旨在支持尽可能多的平台,因此它不支持RGBA16F纹理。Comfy针对桌面和WASM通过WebGL 2,两者都允许f16
纹理,因此所有渲染都以HDR和色调映射的方式进行。这允许我们的泛光实现利用HDR颜色,并大大简化了与灯光的工作,因为光强度可以远超过1。
内置功能:Comfy包含许多macroquad没有的额外功能,例如egui本身是comfy的一部分,并且可能将持续如此,直到出现更好的替代品。Macroquad和miniquad提供小的灵活构建块,而comfy旨在成为制作游戏的完整且相对有见地的途径。
还有很多细微的差别,但从原则上讲,您可以将comfy视为“带有更多内置功能的macroquad,建立在wgpu之上,跨平台功能较少”。
comfy打算支持所有这些功能,但还需要更多开发。许多引擎(例如bevy和rend3)最终使用渲染图来将渲染逻辑暴露给用户。虽然这些非常灵活并且提供高性能,但它们的API并不简单。
鉴于我们的目标不是支持AAA图形,目标应该是找到某种形式的中间地带,在这里我们可以实现与macroquad相似的API简单性、表达性和乐趣,同时利用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的目标不是成为最漂亮的代码库。许多事情可能不是最优的,对于其中一些,开放讨论非常有意义。但仅仅重格式化代码、移动东西或进行某种重组的pull请求可能会被拒绝,除非之前有讨论。
如果你发现任何不符合预期的工作,请务必提出问题。Comfy旨在成为那些想制作游戏的人的富有成效和人性化的伴侣。
如果某些东西不够人性化,或者你有一个想法,认为它可以通过不牺牲太多来更人性化,请提出问题。
如果你真的只想提出一个pull request来贡献某些东西,而不进行之前的讨论,最好的地方是示例。简单和高级示例,以及小型示例游戏都受欢迎。
由于发展速度快,Comfy目前不追求大量的文档覆盖。示例比文档更受欢迎,因为当API更改时更容易修复。大多数事情应该是自我解释的。
如果你想讨论任何关于Comfy的事情,请加入我们的Discord服务器。
许可协议
Comfy是免费和开源的,并双重许可在MIT和Apache 2.0许可下。
使用Comfy的游戏
Comfy正在被LogLog Games使用,其中一款游戏已在Steam发布,名为Unrelaxing Quacks - 快速的幸存者!
我们还使用了Comfy在一些小型游戏中,例如我们的1-bit jam参赛作品,在那里我们实验了CPU纹理和2D光线追踪。
Comfy得到了Jetbrains的支持,通过他们的开源计划并提供Comfy开发的许可证。
依赖项
~27–69MB
~1M SLoC