与保留模式 GUI 相比,使用即时模式 GUI 对性能有何影响?

What are the performance implications of using an immediate-mode GUI compared to a retained-mode GUI?

我目前正在开发一个标准的 Windows 桌面应用程序(标准意味着没有花哨的东西:只有按钮、文本、滑块等),并决定自己编写一个 GUI 框架,之后研究了一些 GUI 框架并被所有框架排斥。既然是业余项目,我也愿意尝试,决定把GUI做成immediate-mode,而不是retained-mode,因为我很喜欢它简化代码的方式。不过问题来了:

将即时模式 GUI 用于典型桌面应用程序时,与保留模式 GUI 相比,对性能有何影响?

我总是听说 IMGUI 的性能更差,因为它必须重绘每一帧(或者,如果它以某种方式缓存,它仍然必须每帧执行逻辑)。但是我们在这里谈论的还有多少?我燃烧的时间是 CPU 的两倍吗?更多的?如果我假设 运行 20 个 IMGUI 程序,它会最大化 CPU(假设我已经对其进行了优化)吗?我只想知道大概情况,以及权衡在非游戏环境中是否仍然可行,在非游戏环境中不需要重绘每一帧。

还有一个关于延迟的含义我不明白。在chapter discussing IMGUI in a work-in-progress book by Johannes Norneby中解释如下:

Frame shearing

One aspect of IMGUI to be aware of in the context of real-time applications (constantly rendering new frames many times per second) is that user interactions will always be in response to something that was drawn on a previous frame. This is because the user interface must be drawn at least once for the user to be aware that there are widgets there to be interacted with. Most of the time this doesn’t cause any problems if the frame rate is high enough, but it is something to be aware of.

这在保留模式 GUI 中有何不同?这是否意味着我在保留模式 GUI 上多了一帧输入延迟?

由于似乎对这个问题仍然有些兴趣(从观点来看),我想我也可以 post 更新一下。

我最终实现了一个即时模式 GUI 作为我的硕士论文,并且在性能上有一些数字。要点是:

很好 - 实施质量占主导地位,而不是系统特征。

与许多其他现有的保留模式 GUI 相比,我的即时模式实现通常执行得更快。大多数 GUIs 都没有经过优化,这一事实掩盖了范式之间的理论性能差异。总的来说,imgui 是一种完全可行的方法,可以创建响应速度快且不会耗尽电池电量的 GUI。

我用大约 50% 的 UI 元素创建了一个 Spotify 克隆,并且渲染单个帧在微秒范围内。事实上,该应用程序始终使用不到 400 微秒的单帧。在 60 Hz 显示器上启用 V-Sync 后,这相当于在单核 (每 16 毫秒 400 微秒) 上大约 3% CPU 负载 天真的实现。此外,这 400 微秒中有相当一部分是由常数因素引起的,这些常数因素不会增加更多 UI 元素的负载(例如,接收输入或设置不随 UI 缩放的 GPU 状态复杂度)。

我这个完美主义者仍然不喜欢什么都不做的 GUI 消耗周期的事实,但好处是巨大的:当 GUI 被大量消耗时与 window 交互,或者当 window 被调整大小时,它仍然达到 400 微秒! 这将许多现有的保留模式 GUI 打得落花流水。尝试调整 Spotify、Windows Explorer、Visual Studio 或基本上任何其他桌面应用程序的大小,并查看它的反应,以了解我的意思。我的猜测是,在调整大小时,Spotify 在我的 PC 上会下降到大约 2 帧/秒。

而更改 UI 基本上是免费的。如果您在一帧中显示一百个按钮,然后在下一帧中将它们全部替换为文本框,性能仍然没有差异。保留模式 GUI 在这种情况下往往会遇到困难。

另外三个想法:

  • 大部分时间花在了文字渲染上,其余的几乎无关紧要。如果你想大量优化,这将是重点关注的事情。但即使稍加优化,也可以做得不错。

  • 我怀疑性能上的巨大差异是否只能通过保留模式和立即模式之间的差异来解释,甚至根本无法解释。例如,Spotify 使用 Web 堆栈 UI;那肯定会很慢。

    我想,WPF、Win32 和类似的东西之所以慢,是因为它们可以侥幸逃脱,或者因为它们针对与我们现在使用的硬件完全不同的硬件进行了优化。当然,他们也做得更多,但远远不足以证明差异是合理的。

  • 我确定你可以制作一个比我的立即模式 GUI 快很多的保留模式 GUI。总的来说,它没有什么动力,老实说,这有点可悲;我喜欢高效的东西。

更新

既然有人问了,我决定发表论文了。

请注意,您将看到一些不适合 public 发布的内容,并且没有达到我个人对 public 刚刚发布的软件的最低质量期望(这这就是我一开始没有发布它的原因)。所以请只将它用于教育目的,而不是用它来构建实际的软件。我也不支持。

下载内容包括论文本身(德文!)、Windows 的一些预构建可执行文件和源代码(C++):

https://1drv.ms/u/s!AsdZfH5hzKtp9zy1YZtHgeSMApOp?e=FbxLUs

玩得开心!