2个不稳定版本
0.2.0 | 2024年5月3日 |
---|---|
0.1.0 | 2023年12月8日 |
#355 in 图形API
用于 comfy
325KB
7.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为您的游戏,可能需要深入研究源代码,并可能需要手动调整一些东西。尽管如此,源代码设计得简单且易于修改。如果您想制作游戏马拉松游戏,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
,这意味着你可以看到大约30
个世界单位。在一个 16x16 角色像素的艺术游戏中,你最好设置相机的缩放,使每个角色单位为1
个世界单位。
内置Z索引。在宏四象限中,绘制调用按照你调用的顺序进行。在舒适中,几乎所有东西(不包括文本和UI)都接受一个z_index: i32
。这意味着你不需要自己排序调用,舒适会为你完成,同时在尽可能的情况下批量处理绘制调用。
HDR渲染纹理:宏四象限针对GLES2/3以支持尽可能多的平台,因此它不能支持RGBA16F纹理。舒适针对桌面和WASM通过WebGL 2,这两者都允许f16
纹理,因此所有渲染都以HDR和色调映射的方式进行。这使得我们的光晕实现可以从HDR颜色工作,并大大简化了与灯光的工作,因为光强度可以远超过1。
内置功能:舒适包含许多宏四象限没有的额外功能,例如,egui本身就是舒适的一部分,并可能保持这种方式,直到出现更好的替代品。宏四象限和迷你四象限提供小的灵活构建块,而舒适旨在成为制作游戏的一种完整且相对有见地的方法。
还有许多细微的差别,但原则上你可以将舒适视为“内置更多功能的宏四象限,建立在wgpu之上,跨平台能力较弱”。请注意,因为舒适建立在wgpu之上而不是OpenGL,所以我们没有与GL相同的即时模式交互。这使得一些事情变得更加困难,例如渲染目标、更改着色器统一变量等。
舒适打算支持所有这些功能,但这需要更多的发展。许多引擎(例如bevy和rend3)最终使用渲染图来向用户展示渲染逻辑。虽然这些非常灵活,并且提供高性能,但它们的API并不简单。
由于我们的目标不是支持AAA图形,目标应该是找到某种形式的折中方案,我们可以在API的简单性、表达性和乐趣方面实现类似于宏四象限的东西,同时利用wgpu的全部功能。
舒适最终的设计目标是,其大部分API应该仅从类型签名中就可以理解,而无需深入研究文档,也不需要过度使用脚手架。
rend3
我对rend3的经验不多,除了略微查阅其代码之外,但作为一个3D渲染器,它与舒适填补了非常不同的细分市场。如果你正在构建3D游戏并且不想做PBR渲染,rend3可能是你想要考虑的东西。
Fyrox
Fyrox似乎正在试图与Unity、Godot和Unreal正面竞争,目前是唯一一个功能齐全的Rust游戏引擎,值得注意的是,它还包括一个完整的3D场景编辑器。其3D演示特别令人印象深刻,如果你正在寻找一个功能齐全的3D引擎,它肯定是一个值得考虑的选择。
尽管如此,舒适毫无歉意地专注于简单的游戏,因此与Fyrox填补了非常不同的细分市场。
bevy
Bevy是“大型Rust游戏引擎”位置的一个竞争者。在2D功能方面,Bevy在社区规模和总体crate支持以及模块化方面确实占上风,但这是舒适甚至不想竞争的地方。舒适旨在有见地、简单和实用,而Bevy的目标是模块化、可扩展,并建立在它涵盖的ECS之上。
由于其模块化,Bevy通过社区资产crate提供了许多更多功能,但它有一个相对分散和不稳定的生态系统。
舒适的目标在许多方面是相反的。目标是提供一个简单、稳定和实用的基础。舒适不是一个用于实验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 requests可能会被拒绝,除非之前有讨论。
如果你发现任何不符合预期的工作,请创建一个问题。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开发许可来实现。
依赖关系
~28–65MB
~1M SLoC