QT-Embedded程序性能优化方法

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

QtEmbedded和Qt一样,在4.5版本之后提供了三种不同的授权协议GPL,LGPLCommercial。对于嵌入式开发来说,资源是极为重要的,而现在看来,Qt变得越来越庞大,越来越耗费稀缺的设备资源,这时,优化就变得格外重要了。在做数码相框这个项目中,是基于loongson1B开发板上的QT程序,故需要探究如何优化QTE程序,使数码相框在有限的嵌入式硬件上更好的发挥系统性能,经过收集资料及测试,优化主要有以下两个大的方面:分别为Qt系统性能和QtGUI性能优化:

1.Qt系统性能优化

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

着重注意的是,最直接节省资源的办法是在编译时去掉不需要的特性。

1、编程风格

2、静态链接vs动态链接

3、替换内存分配方式

4、绕过后备存放区

首先是编程风格:

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

其次是选择动态或是静态链接:

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

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

建立一个静态编译。

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

./configure–static

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

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

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

然后是替换内存分配方式:

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

void*operatornew[](size_tsize)

{

returnmalloc(size);

}

void*operatornew(size_tsize)

{

returnmalloc(size);

}

voidoperatordelete[](void*ptr)

{

free(ptr);

}

voidoperatordelete[](void*ptr,size_t)

{

free(ptr);

}

voidoperatordelete(void*ptr)

{

free(ptr);

}

voidoperatordelete(void*ptr,size_t)

{

free(ptr);

}

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

最后是绕过后备存放区:

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

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

2.QtGUI性能优化:

一、QSS

关于Qt设置样式的方法主要两种:

1、给qApplication设置全局的styleSheet,此方法作用于全局,若全局都用一种样式,每个小应用不用其他样式,此法效率最高,

反之过多的样式堆积在qApp的话会造成效率大幅度下降。

2、给单独的每个子窗口设置styleSheet.

关于调用setStyleSheet()该方法,设置styleSheet,最好一个子窗口只调用1次,多次调用setStyleSheet方法效率变低:

以部分源码来分析

d->createExtra();

QStyleSheetStyle*proxy=qobject_cast<QStyleSheetStyle*>(d->extra->style);//指针安全转化,消耗

if(proxy){//stylesheetupdate

proxy->repolish(this);//重置styleSheet

return;

}

voidQStyleSheetStyle::repolish(QWidget*w)

{

QList<constQWidget*>children=qFindChildren<constQWidget*>(w,QString());//遍历节点,消耗

children.append(w);

styleSheetCache->remove(w);//reset

updateWidgets(children);//更新该节点和该节点下所有ChildstyleSheet

因此QWidget每设置一次,就会对应重置该QWidget下所有孩子的styleSheet以及其它操作,效率不高

二、样式图片的大小

比如一个QPushbutton的样式:每种状态的图片20K和每种状态的图片1K的效率是不能相比的,而且影响内存大小。

三、延时加载机制

这个是优化的难点,但是也是最明显的优化方法,如下:

1、先创建10QWIdget到一个QWindow,然后将显示QWindow显示出来

2、先创建1QWIndow然后马上显示,然后再分时加载10QWidget,逐步显示出来

CPU较差的情况下,第二种方式用户体验明显比地一种高。这点在优化QScrollArea时尤其明显,

可以将QScrollArea里的控件只显示局部,由用户拖拉的过程中,一个个加载,这样不会造成拖卡现象,而且窗口开启速度变快很多。

PS.以上只是简单阐述以下方式,具体方式还是根据实际硬件及软件规格来选择。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值