Qt性能调节

来源:互联网 发布:tv霸网络电视安卓版 编辑:程序博客网 时间:2024/06/12 01:34

 


    在低端的设备上编写嵌入式程序的时候,Qt for Windows CE 和 Qt for Embedded Linux 都提供了大量的选项,这些选项通过很多不同的权衡来帮助减少内存和CPU的需求,这些选项非常广泛,从编程风格,链接到内存分配。

    请注意,最直接的节省资源的做法是不要去编译不需要使用的功能模块,请参考”Fine tuning features”一文,它提供了非常详细的说明

本文一共分为如下几个专题来讲述:


  • 编程风格
  • 静态链接 vs 动态链接
  • 另一种可选择的内存分配方式
  • 绕开 “Backing store”


编程风格

    一次性创建 dialog 和 widget,然后在需要的时候调用 QWidget::show() 和 QWidget::hide()方法,而不是每次在需要使用的时候,都去创建它们,在不需要的时候就删除它们。避免应用程序启动过程缓慢,不要在一开始的时候就把 dialog 和widget 都创建好,而是在第一次需要使用它们的时候再去创建它们。所有这些工作都能提高 CPU 的效率,当然,它们需要占用一些内存。


静态链接 vs 动态链接

    有很多CPU和内存使用ELF(Executable and LinkingFormat)链接过程,相对于那种有很多的可执行模块然后在运行的过程中动态链接的方法而言,在编译一个应用程序的时候使用静态链接可以节省很多的资源。所有的程序都被静态的编译链接成了一个可执行文件中。

    这个方法可以加速应用程序的启动速度,并且可以减少内存消耗,付出的代价是灵活性(当添加一个模块的时候,必须重新编译这个单一的可执行程序)和程序的健壮性(如果一个模块有bug,那么整个程序都将收到影响)。


创建静态链接

    在运行 configure 命令的时候,使用 –static 编译选项,这样就可以把整个 Qt 编译成静态链接库。

     ./configure –static

   为了编译一组应用程序到成一个单一的应用程序,把每一个应用程序都定义成一个独立的Widget(或者是一个widget的集合),并且在main()函数中包含尽可能少的代码。然后再写另外一个应用程序提供一种在这些不同的应用程序之间切换的方式。Qt Extended平台是使用这个方法的最好的例子,它可以被编译成一组动态链接的可执行文件,也可以编译成一个单一的静态链接程序。

    注意:一个应用程序还是会动态的去链接标准的C库,和在设备上会被其它程序使用到的一些库。

    当安装最终用户的应用程序的时候,这种方法可能不是一个可行的选择,但是当为一个设备编写一个单一的应用程序的时候,尤其是这个设备只有很有限的CPU能力和内存的时候,这种方法非常有好处。

 

另外一种可选的内存分配方法

    某些平台上的C++编译器,new 和 delete 操作符的效率特别低,重新实现这个操作符能够提高内存管理的效率。

  1. void *operator new[](size_t size)
  2. {
  3.      return malloc(size);
  4. }
  5. void *operator new(size_t size)
  6. {
  7.      return malloc(size);
  8. }
  9. void operator delete[](void *ptr)
  10. {
  11.      free(ptr);
  12. }
  13. void operator delete[](void *ptr, size_t)
  14. {
  15.      free(ptr);
  16. }
  17. void operator delete(void *ptr)
  18. {
  19.      free(ptr);
  20. }
  21. void operator delete(void *ptr, size_t)
  22. {
  23.      free(ptr);
  24. }
复制代码

上面这段代码展示了必要的代码,如何切换到相应的 C 语言的内存分配方式。


绕过 ”Backing store”

    在绘图输出的时候,Qt会使用一个”Backing store”的概念,比如,一个绘图缓冲区,为了减少界面闪烁,并且支持一个图形操作,比如混合等。

    对于每一个客户端程序的缺省行为是,程序把自己的widget画到一块内存中,然后WindowsServer负责把这段内容放到屏幕上去。但是如果是定义良好的硬件的话,并且在嵌入式设备中经常都是这种情况,绕过这个过程就会非常有用,这样就允许客户端应用程序直接操作底层硬件,这里有两种方法去完成直接绘制,第一种方法是为每一个widget都设置Qt::WA_PaintOnScreen窗口属性;另一种方法是使用QDirectPainter类来在framebuffer上面保留一块区域。更多的详细信息请参考”Architecture”文档中的”direct painting”一节。

 

---------------------------------------------------------------
声明:本文是Qt核心技术论坛翻译文章,如需转载,请注明本文链接:
http://www.insideqt.com/bbs/viewthread.php?tid=31

注:本文翻译自 Qt 4.5.0 for Embedded Linux 的联机帮助文档,”Qt Performance Tuning”

---------------------------------------------------------------