User interface 为什么GUI代码在计算上如此昂贵?

User interface 为什么GUI代码在计算上如此昂贵?,user-interface,language-agnostic,User Interface,Language Agnostic,你们这些飞越者 我想知道为什么GUI代码会占用很多cpu周期。原则上,图形化渲染远没有Doom复杂(尽管大多数公司GUI都会引入大量的窗口装饰)。事件处理层似乎也是一个沉重的成本,然而,一个编写良好的实现似乎应该在具有大量内存/缓存的现代处理器上高效地在上下文之间切换 如果有人在他们的大型GUI应用程序上运行了探查器,或者是一个普通的API本身,我对瓶颈所在的位置很感兴趣 可能的解释(我想)可能是: 硬件和应用程序接口之间的高度抽象 对要执行的正确代码进行大量的间接寻址 低优先级(与其他流程相比

你们这些飞越者

我想知道为什么GUI代码会占用很多cpu周期。原则上,图形化渲染远没有Doom复杂(尽管大多数公司GUI都会引入大量的窗口装饰)。事件处理层似乎也是一个沉重的成本,然而,一个编写良好的实现似乎应该在具有大量内存/缓存的现代处理器上高效地在上下文之间切换

如果有人在他们的大型GUI应用程序上运行了探查器,或者是一个普通的API本身,我对瓶颈所在的位置很感兴趣

可能的解释(我想)可能是:

  • 硬件和应用程序接口之间的高度抽象
  • 对要执行的正确代码进行大量的间接寻址
  • 低优先级(与其他流程相比)
  • 行为不端的应用程序用调用淹没API
  • 对象定向过度
  • 在API中完成糟糕的设计选择(不仅仅是问题,还有设计理念)
  • 一些GUI框架比其他的要好得多,所以我想听听不同的观点。例如,Unix/X11系统与Windows甚至WinForms有很大不同


    编辑:现在是一个社区维基-开始吧。我还有一件事要补充——我在学校里是一名算法专家,如果GUI代码中存在效率低下的算法,我会很感兴趣。再说一遍,这可能只是实现开销。

    我一般不知道,但我想在列表中添加另一项-字体渲染和计算。在字体中查找矢量图示符并将其转换为具有抗锯齿的位图表示是一项不小的任务。通常需要做两次-首先计算文本的宽度/高度以进行定位,然后在正确的坐标处实际绘制文本

    此外,目前大多数绘图代码都依赖于剪裁机制来更新GUI的一部分。因此,如果只需要重画一部分,代码实际上会在幕后重画整个窗口,然后只需要实际更新所需的部分

    添加:

    我在评论中发现:


    我对这个也很感兴趣。不可能只使用cpu来呈现gui,因为如果您的gfx卡没有合适的驱动程序,桌面图形呈现速度会非常慢。如果你有gfx驱动程序,那么桌面gfx的速度有点快,但从来没有directx/opengl应用程序那么快

    我的理解是这样的:现在的每一张图形卡都支持通用的绘图界面。我不确定它是否叫做“VESA”,“SVGA”,或者这些只是过去的旧名字。无论如何,这个接口涉及到通过中断来完成所有的事情。每个像素都有一个中断调用。或者类似的。然而,合适的VGA驱动程序能够利用DMA和其他增强功能,从而降低整个过程的CPU密集度

    增加了2:啊,对于OpenGL/DirectX,这是今天图形卡的另一个特性。它们针对独占模式下的3D操作进行了优化。这就是为什么速度如此之快。普通的GUI只利用基本的2D绘图过程。因此,每次需要更新时,它都会发送整个屏幕的内容。然而,3D应用程序将一组纹理和三角形定义发送到VRAM(视频RAM),然后将它们重新用于绘图。他们只是说“用纹理集25画出三角形集38”。所有这些东西都缓存在VRAM中,所以这又快了很多

    我不确定,但我怀疑现代3D加速GUI(Vista Aero、Linux上的compiz等)也可能利用这一点。他们可以预先将常用位图发送到VGA,然后直接从VRAM重用它们。但是,每次更新时仍需要直接发送任何应用程序绘制的曲面


    添加了3:更多想法:用于Windows、Linux等的现代GUI是面向小部件的(即面向Windows扬声器的控件)。问题是每个小部件都有自己的绘图代码和相关的绘图面(或多或少)。当窗口需要重新绘制时,它调用其所有子窗口小部件的绘图代码,而子窗口小部件又调用其子窗口小部件的绘图代码,等等。。每个小部件都会重新绘制其整个表面,即使其中一些被其他小部件遮挡。使用上述剪裁技术,一些绘制的信息会立即被丢弃,以减少闪烁和其他瑕疵。但仍然有很多手动绘图代码,包括位图拼接、拉伸、倾斜、绘制线条、文本、洪水填充等。。所有这些都转化为一系列putpixel调用,这些调用通过剪裁过滤器/遮罩和其他东西进行过滤。啊,是的,alpha混合现在也很流行,因为它的效果很好,这意味着需要更多的工作。所以是的,你可以说这是因为大量的抽象和间接。但是你真的能做得更好吗?我不这么认为。只有3D技术可能会有所帮助,因为它们利用GPU进行阿尔法计算和剪裁。

    嗯,这是相当多的

    最简单但可能最明显的答案是,这些GUI应用程序背后的程序员都是非常糟糕的程序员。您可以继续编写代码,这样做最奇怪的事情,速度会更快,但似乎很少有人关心如何做到这一点,或者他们认为这是一个昂贵的无利可图的时间浪费的努力

    将计算直接加载到GPU并不一定能解决任何问题。GPU和CPU一样,只是它的通用性较差,更多的是一个数据并行处理器。它可以非常好地进行图形计算。不管你有什么图形API/OS和驱动程序组合,它们都不会真正起作用