3个版本 (破坏性)

0.4.0 2023年6月3日
0.2.0 2022年9月8日
0.1.0 2022年8月25日

#202 in #egui

每月27次下载
3 crates 中使用

MIT 许可证

26KB
173

Egui Backend

egui 是一个即时模式的GUI库,可以嵌入到现有的框架/游戏引擎中。该库基本上以 RawInput 作为输入,并以 ClippedShapes 作为输出。

原始输入

这是一个基本包含窗口事件的结构,如窗口大小调整、鼠标事件如光标位置/点击、键盘事件如按键/释放/IME输入等。其中大部分事件来自跨平台的窗口库,如 winitglfwsdl2 等。

裁剪形状

这些是基本适合GPU的数据结构,需要通过图形后端渲染到屏幕上。这可以是低级图形如 openglvulkan 等,或者是更高层次的抽象,如 wgpuvulkano。甚至是更高级的抽象,如2D渲染器,例如 skia

egui_backend crate试图将这些后端减少到特质实现。这允许你编写一个egui应用程序,并根据需要切换后端。

Eframe

egui 已经有一个官方的后端crate,称为 eframe。它使用桌面上的winit和在Web上编写的自定义js后端。如果winit表现良好,建议坚持使用eframe。

用例

使用备用后端解决漏洞

如果你使用的是winit,突然一些用户抱怨在某些特定配置(如fedora + nvidia)上出现崩溃。我们不知道修复这个崩溃需要多长时间。所以,你立即将后端切换到某些替代窗口后端,如 glfw,可能没有这个特定错误。这可以作为不同版本发布,或者你可以包含两个后端,并根据用户配置,在启动时决定使用哪个后端。如果你意识到这是一个vulkan错误,你可以立即像上面一样切换到opengl后端。

暴露内部

如果你对多个后端不感兴趣,可以使用窗口后端的内部结构,例如获取其“window”结构体或原始的“events”列表等。例如,glfw-passthrough 库有一个使窗口透过的功能,这对于覆盖层非常有用。如果你正在创建覆盖层,就没有必要在其它后端上进行抽象。这允许单个库同时服务于这两个用例。

作为模块化参考实现

尝试创建自定义后端时,难免会出现一些错误,比如不清楚尺寸是物理像素/坐标还是逻辑像素/坐标。但一个良好的参考实现将为新的后端实现提供一个启动平台。同时,开发者可以始终重用一些来自库的元素,例如 keymousebutton 或其他事件转换函数。

分离 Gfx 和窗口 API

egui_backend 正在尝试使用特质来分离 API 边界。这将允许像 wgpu/glow/three-d/rend3 和其他 gfx 后端这样的库仅实现 GfxBackend 特质。winit/sdl2/glfw 也只会实现 WindowBackend 特质。这将使它们能够相互协作,而不需要(或最小化)胶水代码。因此,如果有人想使用 vulkano 或 ash 或 erupt 等库创建新的后端,他们只需要实现这个特质,然后就可以让它与 winit/sdl2/glfw 等窗口库一起工作。

限制

为了保持简单,明确排除了某些功能。

  1. 没有多个窗口。gfx 和窗口 API 需要同步窗口和交换链的生命周期。这是一个特殊需求,不应该影响绝大多数其他用户的用户体验。

目前,我们假设在任何时刻应用程序的生命周期中最多只有一个窗口。

依赖关系

~4–10MB
~88K SLoC