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 中使用
26KB
173 行
Egui Backend
egui
是一个即时模式的GUI库,可以嵌入到现有的框架/游戏引擎中。该库基本上以 RawInput
作为输入,并以 ClippedShapes
作为输出。
原始输入
这是一个基本包含窗口事件的结构,如窗口大小调整、鼠标事件如光标位置/点击、键盘事件如按键/释放/IME输入等。其中大部分事件来自跨平台的窗口库,如 winit
、glfw
、sdl2
等。
裁剪形状
这些是基本适合GPU的数据结构,需要通过图形后端渲染到屏幕上。这可以是低级图形如 opengl
、vulkan
等,或者是更高层次的抽象,如 wgpu
或 vulkano
。甚至是更高级的抽象,如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
库有一个使窗口透过的功能,这对于覆盖层非常有用。如果你正在创建覆盖层,就没有必要在其它后端上进行抽象。这允许单个库同时服务于这两个用例。
作为模块化参考实现
尝试创建自定义后端时,难免会出现一些错误,比如不清楚尺寸是物理像素/坐标还是逻辑像素/坐标。但一个良好的参考实现将为新的后端实现提供一个启动平台。同时,开发者可以始终重用一些来自库的元素,例如 key
或 mousebutton
或其他事件转换函数。
分离 Gfx 和窗口 API
egui_backend 正在尝试使用特质来分离 API 边界。这将允许像 wgpu/glow/three-d/rend3 和其他 gfx 后端这样的库仅实现 GfxBackend 特质。winit/sdl2/glfw 也只会实现 WindowBackend 特质。这将使它们能够相互协作,而不需要(或最小化)胶水代码。因此,如果有人想使用 vulkano 或 ash 或 erupt 等库创建新的后端,他们只需要实现这个特质,然后就可以让它与 winit/sdl2/glfw 等窗口库一起工作。
限制
为了保持简单,明确排除了某些功能。
- 没有多个窗口。gfx 和窗口 API 需要同步窗口和交换链的生命周期。这是一个特殊需求,不应该影响绝大多数其他用户的用户体验。
目前,我们假设在任何时刻应用程序的生命周期中最多只有一个窗口。
依赖关系
~4–10MB
~88K SLoC