X Server 的优化

X Server是一个广泛使用的图形引擎,提供用户界面绘画的基础图形原语以及用户事件的截获和发布功能。Xserver的图形操作可以由软件实现,然而,很多的显卡提供了硬件加速功能。如果利用这些硬件加速功能来实现Xserver的一些图形操作,将可以极大的提高X server的性能。

目前,嵌入式上X server 使用kdrive (tinyX) 的较多,但也有逐渐向Xorg server迁移的趋势。对这两种Xserver,分别有一个对应的硬件加速架构: KAA 和 EXA。KAA 和EXA非常类似,kdrive也可以使用exa架构。如果要更好的了解如何实现kaa和exa,可以参考openmoko 的Xserver:git://git.openmoko.org/git/xglamo

KAA
Xserver源码中,文件src/hw/kdrive/kdrive.h中的_KaaScreenInfo描述了可以使用硬件加速来实现的函数,主要有四组:Solid,Copy,Blend和Composite。Solid组函数对屏幕上某块区域进行颜色填充;Copy组函数将屏幕上一个矩形区域拷贝到另一个位置。Blend组函数将两块矩形区域alpha混合;Composite组函数更复杂,先将一块区域进行掩码操作,再和另一块区域alpha混合,可能还有填充,旋转能操作。Blend函数可看作Composite的一个特例。

每组函数都有三个函数(Composite是四个), 如PrepareSolid, Solid,DoneSolid。PrepareXXX判断硬件能不能进行对应的加速操作,不能的话则仍然使用软件实现。XXX(如Solid)进行真正的硬件加速操作。DoneXXX一般不用实现。

在对某个矩形区域加速之前,这块区域需要位于显卡的framebuffer之上,包括onscreen 和 offscreenframebuffer。KAA框架中的内存管理程序(koffscreen.c)实现将一个区域拷贝到framebuffer之上,并按一定算法将过期的区域移出。

可以使用gtkperf或x11perf来测试X server的性能是否提高。

值得注意的是当需要加速的区域太小时,使用软件实现反而更快。这个时候可以再加上判断,当区域太小时,就不要移入framebuffer。如对Copy操作,在kaa.c的kaaCopyNtoN中加上判断即可。

你可能感兴趣的:(X Server 的优化)