QtE的性能优化是一个不容回避的问题。已经看到了很多网友在讨论configure参数等话题。其实,Trolltech的官方网站上对这个问题已经有很深入的解释。本文参考的相关文章参加文章末尾的[引用]部分。
1.configure参数
通常情况下,只有少数一个或者几个程序运行在嵌入式设备上,这些程序并不会覆盖Qt的所有功能。所以,使用Qt提供的源代码编译前的选项配置,可以在生成的库文件中剔除不需要的功能。
./configure 可以带上"-no-feature-<指定要剔除的功能项>就可以关闭某项功能,比如
./configure -no-feature-thread
关于qt支持的功能列表可以参考 ./src/corelib/global/qfeatures.txt
值得一提的是QT为我们提供的一个工具"qconfig",在网络上搜索了一下,居然很少见到有关这个工具的内容。它包含在QTE,QT-x11等多个版本里面,最好用desktop的自带的编译器来编译它,它的位置在./tools/qconfig里面。很遗憾,原来编译x11平台的qte的时候把工作目录删掉了,现在需要重新编译一遍,编译出这个工具。然后使用它生成需要的qte-for-arm的配置文件。再次使用arm-linux-gcc工具链编译qte.希望后来的同志不要重蹈我的覆辙。
所有的配置文件都放在./src/corelib/global/下面,可以用qconfig打开几个系统缺省的配置文件查看一下作为参考,最终将你的文件存储为./src/corelib/global/gconfig-myfile.h
最终的命令行是 ./configure -qconfig myfile
当然了如果想省事,可以直接利用系统缺省的一组配置:
./configure -qconfig minimal
等。。。
2.性能优化
1)不要频繁的new delete窗体,改用hide(), show()
2)不要在启动时就建立所有的窗体,使用延迟机制或者在需要时再建立。
3)使用静态链接。 关于这一点我还没有尝试,不过据QT的资料说,它可以加快启动时间和内存占用率。缺点是对flexibility和robustness的损害。我最大的疑问是按照字面理解这是否意味着程序运行时不再需要QT lib?如果是这样的话,那就是好事了。
./configure -static可以将QT设置为静态链接模式.
4)不要使用new,delete机制,因为很多编译器对这类内存分配函数的执行效率不高。可以使用:
void *operator new[](size_t size)
{
return malloc(size);
}
void *operator new(size_t size)
{
return malloc(size);
}
void operator delete[](void *ptr)
{
free(ptr);
}
void operator delete[](void *ptr, size_t)
{
free(ptr);
}
void operator delete(void *ptr)
{
free(ptr);
}
void operator delete(void *ptr, size_t)
{
free(ptr);
}
将缺省的new delete替换掉。
5)关闭双缓冲。通常为了防止
界面闪烁,所有的窗体并不直接写屏幕,而是先写入一个buffer,然后由QT,负责将其写入硬件显示缓冲区。关闭双缓冲有两种方式:
1。为每一个QWidget设置Qt::WA_PaintOnScreen属性。
2。使用QDirectPainter(这个我前几天刚刚使用过,如果需要我可以把代码贡献出来)
[引用]
1."fine tuning features",
http://doc.trolltech.com/4.4/qt-embedded-features.html2."Performance Tuning",
http://doc.trolltech.com/4.4/qt-embedded-performance.html