2017-06-02 12 views
0

如何重现:不断重绘8000个无形的项目,当鼠标区域也存在一个场景,会导致CPU占用率过高

  • 我的代码运行
  • 按住鼠标上出现
窗口

你会发现CPU使用率相当高,尽管它取决于你的硬件。在my PC它是20%(4个虚拟内核中的每一个都是5%)。

我给这家测试用例的动机:在我真正的应用程序我有很多的不可见(culled)项目,而剔除帮助了很多与CPU使用率,它并不能帮助像我一样” d期望。

我想知道为什么CPU使用率如此之高以及如何减少它。

我的代码

main.qml

import QtQuick 2.5 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 800 
    height: 500 

    MouseArea { 
     width: 1 
     height: 1 
     hoverEnabled: true 
    } 
    AnimatedItem { 
     anchors.centerIn: parent 
     width: 100 
     height: 100 
    } 

    Repeater { 
     model: 8000 
     Item { 
      opacity: 0 
      layer.enabled: true 
      width: 1 
      height: 1 
     } 
    } 
} 

AnimatedItem.qml

import QtQuick 2.0 

Rectangle { 
    id: root 
    color: "black" 
    property real rotAngle: 0 
    NumberAnimation on rotAngle { 
     from: 0 
     to: 360 
     loops: Animation.Infinite 
     running: true 
     duration: 500 
    } 
    transform: Rotation { 
     origin.x: root.width/2 
     origin.y: root.height/2 
     angle: root.rotAngle 
    } 
} 

我与QML探查,异形它这已经表明在QML中花费了微不足道的时间。所以我也用C++ profiler(CodeXL)进行了剖析。据报道,大部分时间都花在QSGRootNode::~QSGRootNode()上,因为它叫QSGNodeUpdater::isNodeBlocked(QSGNode*, QSGNode*) const。我查看了Qt源代码,但一直未能弄清楚为什么它甚至会调用前者。

回答

0

我发现,至少在测试用例有效的解决方案:

设置扑杀项目零的父母,然后将其设置回时,他们unculled。

在一些运行中,它并没有帮助我的真实应用程序,但我不打算深入这一点。

相关问题