Qt Embedded性能优化详解

移动开发
Qt Embedded是挪威公司的图形化界面开发工具QT的嵌入式版本,它通过QTAPI与LinuxI/O以及Framebuffer直接交互,拥有较高的运行效率,而且整体采用面向对象编程,拥有良好地体系架构和编程模式.

Qt EmbeddedQt一样,在4.5版本之后提供了三种不同的授权协议GPL, LGPL和Commercial。长久以来,虽然使用Qt Embedded在作开发,但对Qt Embedded的性能方面不甚关心,并且因为抱着对qtsoftware的信心,也没仔细去了解如何优化Qt Embedded。直到前段时间,参加了某个全国嵌入式大赛,使用了Qt Embedded4.5.0在s3c2410平台上,竟然出现了卡机的现象。对于嵌入式开发来说,资源是极为重要的,而现在看来,Qt变得越来越庞大,越来越耗费稀缺的设备资源,这时,优化就变得格外重要了。在Qt Embedded的文档中有关于性能优化的介绍,我做了简单地翻译,希望能给在嵌入式领域使用Qt Embedded的开发者有所帮助。

Qt 性能优化

当在资源稀缺的设备上开发嵌入式应用程序时,Qt for Windows CE 和Qt for Embedded Linux通过调整一系列参数的开启或关闭来内存及CPU的需求。这些选择参数方法的范围主要在编程风格,链接方式及内存分配。

着重注意的是,最直接节省资源的办法是在编译时去掉不需要的特性。详细可以见文档中的fine tuning features部分。

1、编程风格

2、静态链接vs动态链接

3、替换内存分配方式

4、绕过后备存放区

编程风格

与其选择随时地创造对话框和控件当它们需要时,并且在不再需要时删除它们,不如一次性地创建,同时在需要的时候使用QWidget::hide()和QWidget::show() 功能函数。为了避免应用程序启动的缓慢,应该推迟对话框和控件的创建直到需要的时候。所有这样将改善CPU的性能,所需要付出的只是更多的一点内存,但这会加快运行的效率。

动态 Vs 静态链接

许多CPU和内存是通过ELF (Executable and Linking Format)链接进程,重大的节省可以通过静态编译程序的方式实现;而不像是在实际执行中,采集与Qt库有关的部分并且动态链接,所有的应用程序将被创建成一个独立的执行文件,这个文件采用静态方式链接到Qt库上。

这些将改善程序启动时间和减少内存占有率,但前提它会损害灵活实用的特性(一旦增加新的应用部分,必须重新编译一个独立的执行文件)和程序健壮性(假如一个应用部分有bug,将危害到其他的应用部分)。

建立一个静态编译

为了将Qt编译成为一个静态库,在编译时采用-static参数:

  1. ./configure –static 

为了将应用程序套装建立为一个一体化的应用,应当设计各个应用作为单独的控件(或者控件集)并尽可能地使用最少的代码量在main()函数。然后,设计一个独立的应用程序可以提高其他应用程序见交互的方法。Qt Extended platform就是采用典型的实例:它既可以使用一系列动态链接执行创建,也可以作为单独的一个静态的独立应用程序。

需注意的时,程序仍将动态地链接标准C库以及其它库,因为在目标平台上可能会有其他的应用程序使用它们。

当安装最终客户端应用程序时,这个方式不一定是个选择,但是当在为一个受CPU和内存限制的设备开发一个单独的应用程序套装时,这个选择是十分有益的。

替换内存分配方式

在一些平台上,那些运用C++编译的库,在使用“new”和“delete”操作方面有十分差的性能。未来改善内存分配的性能,可以通过以下的功能函数替代实现:

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

以上这些实例显示了必要的代码采用C的内存分配。

绕过后备存放区

当运行时,Qt使用了后备存放区。比如,一个绘图缓存,可以减少闪烁和支持如重叠的图形操作。

一般,默认的流程是这样的,对于每个客户端,将自己的控件传入内存,同时,服务端负责将这些内容从内存中取出并在屏幕上绘制。但是有些硬件是众所周知的,同时已经有嵌入式软件的案例,这些对于绕开后备存放区是很有帮助的,可以运行客户端直接地熟练地操作硬件。这里有两种方式来实现直接绘制:第一种方式是对每个控件使用Qt::WA_PaintOnScreen窗口属性,另一种是使用了QDirectPainter类来保存帧缓存的区域。想获取更多信息,可以参考architecture 文档部分的direct painting细节。

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-29 09:20:41

Qt Embedded Qtopia

2011-06-13 13:35:06

Qt Embedded QT

2010-03-02 09:53:14

MySQL性能优化

2024-03-07 11:03:21

ElasticseaES索引

2009-09-22 17:25:41

优化Hibernate

2011-06-30 10:59:43

2023-07-10 16:18:18

性能优化开发

2010-06-04 11:00:27

hadoop性能优化

2023-11-15 16:35:31

SQL数据库

2011-06-29 15:14:22

Qt Embedded 键盘

2011-06-28 13:47:37

Embedded QT ARM

2011-06-29 15:36:21

Qt Embedded 键盘

2009-03-24 09:14:20

Windows Emb

2009-04-10 09:06:16

Windows Emb

2020-06-04 16:57:07

移动开发互联网实践

2010-04-22 17:27:22

Oracle性能

2021-07-27 20:51:02

AndroidDNS网络

2011-04-22 19:29:15

Windows Emb嵌入式开发

2009-04-08 10:51:59

SQL优化经验

2010-04-13 17:38:13

WindowsEmbe微软嵌入式开发Windows7
点赞
收藏

51CTO技术栈公众号