• 14173阅读
  • 7回复

QTE剪裁与性能优化 [复制链接]

上一主题 下一主题
离线twicave
 

只看楼主 倒序阅读 楼主  发表于: 2008-10-18
— 本帖被 XChinux 执行加亮操作(2008-11-02) —
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.html
2."Performance Tuning",
    http://doc.trolltech.com/4.4/qt-embedded-performance.html   
离线netlove

只看该作者 1楼 发表于: 2008-10-20
正在寻找这方面的资料。第一条我对那个qconfig不明白,我一直用qte,但是没用过这个东西。
第2条的前4很赞同,对5有疑问,如果关闭了双缓冲,界面会闪烁吗?QDirectPainter没用过。我一直用qte-2.3.10,感觉论坛上嵌入式的很少,今天终于碰到一个高手
离线twicave

只看该作者 2楼 发表于: 2008-10-20
高手谈不上,我现在刚刚开始接触这些东西。这篇文章的大部分内容都来自QT的在线文档(就是文末的链接),现在越来越觉得一个组织得比较完善的在线文档系统比什么都重要。

Linux下软件的文档实在太乱了。
离线twicave

只看该作者 3楼 发表于: 2008-11-15
就我目前的理解,QT所使用的双缓冲模式与我们平时说的双缓冲并不相同.

嵌入式设备的双缓冲一般是分配两个硬件缓冲,通过改写LCD的VBuffer地址实现快速切换.

而QT,它在系统中所处的级别估计已经无法对硬件缓冲区的位置进行修改了.
所以,它的硬件缓冲区是唯一的.
QT所做的工作是,首先刷在内存里.然后贴向目标硬件缓冲区.


而DirectPainter的作用,就是提供给用户一个权限.可以直接修改硬件缓冲区.


这些都还是假说.等待后续的文章吧.[In a week.]
离线jzj139
只看该作者 4楼 发表于: 2008-11-18
有前途 加油吧 
qt
离线e2008824
只看该作者 5楼 发表于: 2011-01-28
请教下,如何优化图片的显示速度勒???
离线chen.kline

只看该作者 6楼 发表于: 2011-03-13
多谢指点,按照你的提供的线索,查看了QT Assistant中的文档 ,也粗略了看了看QWidget, QPainter,QDirectPainter和QSreen的部分相关源代码,发现只有Linux平台提供QDirectPainter,并且在linux下用了直接写硬件FrameBuffer的方式实现屏幕操作,可是我的项目是在Wince下使用QT,不知道该如何优化屏幕显示,暂时找不到好的方法。
小小蝼蚁
http://weibo.com/chenkline
离线swet123

只看该作者 7楼 发表于: 2013-07-03
嗯, 不错。我也刚刚在qt doc里看到这几篇文章:
不过在使用自己的qconfig编译qt4.7.0 的时候老是出错。
这点比较头疼。
弄了好几天了。
快速回复
限100 字节
 
上一个 下一个