zoukankan      html  css  js  c++  java
  • Qt 4.5 新功能逐一看 – 性能优化

     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。

    Overall performance

    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倍的性能提升。

    chip-demo

    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宏中即可 此案例所花费时间,并可以以图表的方式生成报告 

  • 相关阅读:
    构造函数详解
    左值和左值引用、右值和右值引用
    Lambda函数
    std::thread详解
    运算符重载
    友元函数和友元类
    xadmin list_filter 外键数据不显示
    中缀表达式转后缀表达式
    Centos 7 minimal 联网
    python 运用三目判断对象中多个属性 有且非空
  • 原文地址:https://www.cnblogs.com/leaven/p/1878686.html
Copyright © 2011-2022 走看看