渲染QWidgets时出现大量页面错误

时间:2011-06-22 15:06:35

标签: c++ windows qt memory-management page-fault

我注意到我的Qt应用程序中存在大量页面错误。我通过调整停靠小部件(下面有几十个小部件的小部件树)2秒钟来重现它,并使用AQTime跟踪该操作。我为此操作收到2000页错误。那是为什么?

在Windows XP 32位上使用Qt 4.5.3

更新:它们是软页面错误 UPDATE2 :我在Qt Designer中创建了一个带有1个组合框的ui,其中包含2个项目。如果我预览这个,每次单击组合框选择其中一个项目时,我会收到200页错误。

Parents
Code Type   Routine Name    Faults  Faults with Children    Hit Count
x86 qt_memfill_template<unsigned int,unsigned int>  2416    2416    5160
  x86   qt_memfill<unsigned int>    2416    2416    5160
    x86 qt_rectfill<unsigned int>   0   2416    5160
      x86   qt_rectfill_template<unsigned int>  0   2416    63
        x86 qt_rectfill_quint32 3   2419    63
          x86   fillRect_normalized 1   2420    63
            x86 QRasterPaintEngine::fillRect    3   2423    63
              x86   QRasterPaintEngine::fillRect    1   2424    63
                x86 QPainter::fillRect  1   2427    63
                  x86   fillRegion  0   2427    15
                    x86 QWidgetPrivate::paintBackground 2   2430    12
                      x86   QWidgetPrivate::drawWidget  0   2430    12
                        x86 QWidgetBackingStore::sync   2   2596    12
                          x86   QWidgetPrivate::syncBackingStore    4   2610    12
                            x86 QETWidget::translateConfigEvent 0   2479    6
                              x86   QtWndProc   0   2495    12

1 个答案:

答案 0 :(得分:1)

最有可能的是,Qt分配了一个新的位图来保存小部件的外观,系统通过为进程分配新页面来满足此请求。在第一次写入这些页面时,发生软页面错误,并且实际页面被映射到进程地址空间。通过在重绘调用之间缓存位图可以避免这种情况;但是,在调整大小时,所需位图的大小会发生变化,因此这种优化不再适用;每次尺寸变化时,必须重新分配位图(导致软页面错误)。

这实际上会对性能产生影响吗?