我不是专家,但我想在你的列表中再添加一个项目 - 字体渲染和计算。找到字体中的矢量字形并将其转换为带有抗锯齿的位图表示形式并不是一项小任务。通常需要做两次 - 首先计算文本的宽度/高度以进行定位,然后在正确的坐标处实际绘制文本。
此外,大多数绘图代码今天都依赖于剪切机制来更新GUI的部分内容。因此,如果只需要重新绘制一个部分,代码实际上会在幕后重新绘制整个窗口,然后只取所需的部分进行实际更新。
在评论中,我发现了这个:
“我也非常感兴趣。如果您的图形卡没有适当的驱动程序,则桌面图形呈现
非常慢。但是,如果您有gfx驱动程序,则桌面gfx会变得很快,但永远不会像直接x / opengl应用程序那样快。”
就我所知,今天所有的图形卡都支持用于绘图的通用接口。我不确定它是否称为“VESA”,“SVGA”或者这些只是过去的旧名称。无论如何,该接口涉及通过中断执行所有操作。对于每个像素,都有一个中断调用。或者是这样的什么东西。但是,适当的VGA驱动程序可以利用DMA和其他增强功能,使整个过程大大减少CPU使用率。
哦,还有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进行Alpha计算和剪辑。