在嵌入式Linux系统中应用的GTK+和X分析( 三 )



还可以使用一个更好的方法来完善字体管理系统,即包装GtkStyle,这样开发者就可以通过属性来获得一个窗口的字体,这比直接使用 X 系统字体的名字要更灵活 。比如要显示一个比基本字体要大一号,并且是黑体字就可以调用:

gtk_widget_set_font_bold (widget, TRUE);
gtk_widget_set_font_enlarge (widget, 1);

这是通过在 GtkWidget 结构中加入一个 GdkFont * font 来实现的,GtkWidget 是所有窗口类的父类 。如果设置widget->font 那么就使用它,否则就使用widget->style->font 。

窗口管理

在嵌入系统GUI中,还需要建立一个窗口管理器 。我们可以选择一个开放代码的,轻量级的X管理器,Aewm 。在嵌入系统中,我们会将最上层的窗口设置为获得焦点,并且只有对话框能移动,能显示其标题栏 。
窗口管理器是一个交互端,它可以管理内部与外部的应用程序的窗口 。每一个应用程序的窗口,都会建立一个 socket 连接,并取一个名字 。一个应用可以把请求将自己放在窗口堆栈的最下面,或者将一个命名的应用往上移 。如果一个对话框要在最上层的窗口上打开,那么窗口管理器就将告诉这个最上层的窗口它将不再获得焦点,而新对话框将获得焦点 。

整体尺寸大小
经过一系列的改进后,我们就得到了一个稳定的,功能和性能都能满足嵌入系统要求的GUI了 。在ARM系统下,得到的尺寸大小为:
其中 GTK里面仍然还有不需要的代码,可以将其再去除 。如果再简化一下的话,GTK可以做到850KB,总体大小可以到 2.8M 。

运行性能

将修改过的 GUI 运行在一个 ARM7 的系统上,CPU 为 100MHZ,运行时的效果还不错,窗口响应用户操作的速度很迅速,新的画面创建与显示的速度都能接受 。
但是,启动时的时间却有些问题,比较慢 。在这个 CPU 上,应用程序画面加载与显示的时间需要 2.4秒,其中 1.5 秒是花在了建立与显示 UI 上 。
在较慢的 CPU 上,这样的启动速度是 GTK运行在 X,X 再写到 framebuffer 上导致的 。我们需要分析具体的瓶颈在什么地方 。在深入的调试中,当使用PC机来运行我们的应用,而在ARM设备上显示时,初始化和显示的时间几乎可以忽略不计 。同样,将应用运行在ARM设备上,而在PC机上显示时,性能也很好 。所以数据包的传输,framebuffer上的显示及GTK 的运算速度都不是问题所在 。速度慢的原因可能是这几个因素的先后顺序引起的 。而且内存的占用上也存在问题 。在初始阶段,GTK 构造了大量的对象,GTK 和X是使用共享内存来通讯的,X写到framebuffer,framebuffer也是不变地写到显存上 。这些都是发生在一个较窄总线上相同的内存空间里,这个就会引起速度慢 。

现在知道了X在启动时比较花费时间 。在客户模式下的GTK 的应用,需要连接到X server,通过了认证,得到位深及其他资源 。当然,使用X系统的好处要远大于它的不足 。X系统提供了一个灵活的client/server模型,这样更有利于应用的灵活加入 。你可以在同一时间显示不用的应用窗口,而像GTK /Fb等其他的GUI方式无法做到这一点,当然QPE是个例外 。
2.4秒的延时,也并不能完全否定一切 。在一个700MHZ的windows系统的PC上,Microsoft Word, Excel and IE几乎都需要2秒的时间来启动 。KEdit, 一个KDE的应用程序,在500MHZ的PIII上,加载的时间也需要1.37秒 。
对于启动时间,需要采用其他的办法来加以改善 。一个策略就是在用户等待的时候,显示一些东西来表示系统正在工作,这样会使用户忽略掉启动时间的缓慢 。另一个策略就是可以预先在背后启动一些通用的程序,来有效减少集中启动的时间 。这也是通常嵌入系统所惯用的做法 。

推荐阅读