http://www.qteverywhere.com/archives/90
大家对于Qt诟病比较多的地方就是性能,尤其在嵌入式或者比较低端的平台上。所以在Qt4.5中,第一条设计理念就是提升Qt的运行时性能,内部项目代号称之为Falcon – 猎鹰,目的就是想让Qt飞起来。:-)
其实性能优化在Qt4.5中,算是最最重要,最核心的改进了。为什么放在最后再说,是因为其中所包含的改进是在是太多了,也非常具体,很难简单的概 括。但是,从另一方面来说,对于Qt应用程序的开发者,除非有兴趣潜心研究,着实不需要关心具体的实现细节,原有的Qt应用,只需要运行在新的4.5之 上,你就可以感觉到性能的提升,而不用修改原有程序代码。
深入一些,那么究竟有哪些改进以及性能方面的提升?主要分三部分来说,分别是Qt本身绘图引擎的优化,“热插拔”图形系统以及性能Benchmark工具。
先来看看Qt本身绘图引擎的优化:
简而言之,在Qt4.5之前的版本中,Qt的Paint Engine在QPainter的操作过程中,有一些冗余的地方。在4.5中,这些细微,但是会影响全局性能的函数都被重新仔细分析和优化了,诸 如:QPainter::begin() / end(),save() / restore(), drawTextItem(),drawPixmap()。总体来说,对于一个实际的Widget控件绘图,提升将近50%的效率。下面这张图是一些 Widget在4.4和4.5的benchmark。
Developer Blog here
除了QPaint的改进之外,4.5的Backingstore中也有不少改进,包括去除了许多不必要的QRegion的操作,以及是更加智能的Update操作。
下面的表格展示了含有透明以及不透明控件的Backingstore的不同Update操作性能比较。
Operation | Qt 4.4 | Qt 4.5 | Boost |
---|---|---|---|
Full update (transparent widgets) | 4330 ms | 2446 ms | 1.8x |
Full update (opaque widgets) | 3352 ms | 1464 ms | 2.3x |
Scroll (opaque widgets) | 50231 ms | 3746 ms | 13.4x |
Partial update (opaque widgets) | 4246 ms | 1567 ms | 2.7x |
Complex update (opaque widgets) | 4966 ms | 2265 ms | 2.2x |
Full update (opaque children) | 3376 ms | 1464 ms | 2.3x |
Move (opaque widgets) | 50293 ms | 4188 ms | 12.0x |
Mass update (opaque widgets) | 9560 ms | 1679 ms | 5.7x |
Developer Blog here
另外有比较大改进的地方还有Graphic View。在Graphic Item绘图之前,加入了很多对于exposed areas, StyleOption, intersecting shapes, clips的预判断,这样在真正绘图的时候,速度就会得到提升。最直观的例子就是,在Qt4.4中的4000芯片例子,在Windows平台上平均可以获 得30%的提升,而在Linux上,使用Qt内置的Raster引擎和Graphic View,相比于原有的X11,则可以得到5到100倍的性能提升。
Developer Blog here
还有一些其他细微的改进,以及非图形方面的改进,诸如在X11平台上的绘图引擎中使用XSHM (MIT-SHM)来提升绘图效率,以及通过QIODevice类的优化,提升了File IO的性能,继而提高了FileDialog中对象的加载速度等等。
“热插拔”图形系统 – Pluggable graphics system,顾名思义,就是说你可以自由的选择不同的引擎去做绘图。Qt自带的软件绘图引擎现在可以工作在Linux,以及Mac上,也实现了跨平台。 具体来说,当运行任何Qt的应用的时候,你可以加上下面某个参数,从而让Qt选择相应的绘图引擎进行绘图操作。
-graphicssystem native – 本地引擎
-graphicssystem raster – Qt自带Raster(光栅)引擎
-graphicssystem opengl – OpenGL引擎(显卡需要支持OpenGL)
可以根据需要选择合适的引擎,如果需要高性能,特别是高的刷新率,OpenGL就很合适,如果需要像素级精确地显示,Qt自带的Raster引擎的效果则会好很多。
上面这些是对于桌面系统而言,对于嵌入式系统,则要复杂的多。通常情况下,嵌入式系统的显示系统有以下几种模式:
1) 无加速 (帧缓冲 – framebuffer)
2) 硬件Blitter和 alpha-blending 混合
3) 硬件2D 矢量绘图函数
4) 固定渲染管线 3D引擎
5) 可编程渲染管线 3D 引擎
所以在嵌入式系统中,可以根据不同的硬件显示系统,选择合适的引擎。这样带来的性能提升将比桌面明显的多,下面是一个针对不同显示系统,参考的选择:
Type | Solution |
---|---|
None | Raster |
Blitter | DirectFB |
2D vector | OpenVG |
Fixed-3D | OpenGL (ES) 1.x |
Programmable-3D | OpenGL (ES) 2.x |
在Qt4.5中,1/集成了全新的OpenGL ES2.x引擎,2/大幅提升了Qt本身Raster引擎的绘图性能,3/改进了对于DirectFB的支持。并且对于OpenVG引擎的支持已经在立项 研究,应该很快就可以看到。所以在绝大多数嵌入式系统上,Qt的性能都可以得到提升。而且这些图形引擎中,除了DirectFB之外,都是可以跨平台的。
Developer Blog here
为你的Qt应用或者设备选择一个合适的引擎吧!;-)
最后一个优化部分,其实不是优化本身,而是提供了一个用来做性能分析的函数库:QtBenchLib。因为在应用程序优化的过程中,对应用程序本身执行效 率的优化可能比Qt优化所带来的影响更大。QtBenchLib隶属于QTestLib,使用时只需将需要的测试案例加入到QBENCHMARK宏中即可 此案例所花费时间,并可以以图表的方式生成报告