2017-07-18 169 views
3

我剛開始看Qt Quick,我有一個非常基本的程序,基本上和啓動Qt Quick Controls應用程序項目時一樣。Qt Quick非常緩慢的繪畫

問題是,當我嘗試調整窗口大小時,需要很長時間才能這樣做。這可以在下面的.gif中看到。

Problem

我能找到有類似的問題人們在網絡上的唯一信息是,你可以使用QML探查發現所產生的滯後是在哪裏,有時是由於調試器。所以下面你可以看到QML分析器和gif是在發佈模式下錄製的。

enter image description here

至於我可以告訴動畫鎖定GUI線程了,這是造成渲染或重繪是緩慢的,但我不知道是什麼原因造成的。

我很感謝任何幫助解決這個問題。

並沒有太多的代碼。

Test.pro

QT += qml quick 
CONFIG += c++11 
SOURCES += main.cpp 
RESOURCES += qml.qrc 
QML_IMPORT_PATH = 
QML_DESIGNER_IMPORT_PATH = 
DEFINES += QT_DEPRECATED_WARNINGS 
qnx: target.path = /tmp/$${TARGET}/bin 
else: unix:!android: target.path = /opt/$${TARGET}/bin 
!isEmpty(target.path): INSTALLS += target 

的main.cpp

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 
    if (engine.rootObjects().isEmpty()) 
     return -1; 

    return app.exec(); 
} 

main.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.3 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    SwipeView { 
     id: swipeView 
     anchors.fill: parent 
     currentIndex: tabBar.currentIndex 

     Page1 { 
      Label { 
       text: qsTr("First page") 
       anchors.centerIn: parent 
      } 
     } 

     Page { 
      Label { 
       text: qsTr("Second page") 
       anchors.centerIn: parent 
      } 
     } 

     Page { 
      Label { 
       text: qsTr("Third page") 
       anchors.centerIn: parent 
      } 
     } 
    } 

    footer: TabBar { 
     id: tabBar 
     currentIndex: swipeView.currentIndex 
     TabButton { 
      text: qsTr("First") 
     } 
     TabButton { 
      text: qsTr("Second") 
     } 
     TabButton { 
      text: qsTr("Third") 
     } 
    } 
} 

Page1.qml

import QtQuick 2.7 

Page1Form { 
    button1.onClicked: { 
     console.log("Button Pressed. Entered text: " + textField1.text); 
    } 
} 

Page1Form.ui.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.3 

Item { 
    property alias textField1: textField1 
    property alias button1: button1 

    RowLayout { 
     anchors.horizontalCenter: parent.horizontalCenter 
     anchors.topMargin: 20 
     anchors.top: parent.top 

     TextField { 
      id: textField1 
      placeholderText: qsTr("Text") 
     } 

     Button { 
      id: button1 
      text: qsTr("Press Me") 
     } 
    } 
} 

規格:的Windows 10,Qt的5.9,MSVC 2017年


Qt Forum Cross Post

+0

我沒有任何問題,像你越來越。窗口調整非常順利。您可能需要仔細檢查其他內容。我使用Qt5.9和Visual Studio 2015. – CroCo

+0

@CroCo好的。謝謝。真奇怪。我不知道視覺工作室版本是否會影響它 – Dan

+0

不確定,但調整窗口大小功能是一件常見的事情。我懷疑QML不能支持這個功能。此外,您使用的應用程序非常簡單,即使極簡單的API也不會出現此症狀。有什麼問題在繼續。 – CroCo

回答

-1

在窗口調整大小qml必須重新評估大小的綁定。因此,需要重新計算改變大小或具有錨定屬性的所有內容。 據我所知,QT使用openGL作爲默認渲染器。在窗口上調整openGL渲染緩衝區的大小,並且需要重新繪製完整的場景圖。但在此之前,如果單個元素的大小發生變化,則需要先將其重新渲染。 Qml存儲紋理中的可見元素,以便元素大小調整紋理必須重新創建...

根據您使用的元素或場景圖的生成方式或批次的組成方式,可能會發生更多情況。

如果你想調試場景圖,你可以通過設置環境變量來實現。 例如,你可以通過設置

QSG_VISUALIZE=changes 

更多信息有關Qt Quick Scene Graph Renderer這裏做出改變顏色隨機閃爍。

+0

好的。那麼你知道我怎樣才能加快這個過程? – Dan

+1

聽起來很傻,但不要調整窗口大小,或者不要使用具有動態大小的元素。除此之外,我還沒有找到任何解決方案,我自己呢... – SigSegOwl

+0

好吧,謝謝。你知道ANGLE是否可行嗎? – Dan

0

我認爲你有這個問題,因爲在引擎蓋下使用了軟件渲染。所以需要相當長的時間。因此,要啓用硬件渲染,您需要安裝ANGLE驅動程序。您的分析圖表明交換操作一直在進行,所以這實際上是將所有像素從CPU複製到GPU,所以這就是爲什麼你會看到這種滯後。我不同意@dtech它不會幫助你。我用角驅動程序在Windows渲染非常複雜的GL 3D場景,讓QT能夠說,我相信

1

最近這Qt的錯誤是固定的,因爲5.9.2:https://bugreports.qt.io/browse/QTBUG-59893

這是否弄不好解決這個問題?

+0

謝謝你的回答。當我下班回家時,我肯定會考慮這個問題 – Dan

+0

可悲的是,這似乎並不適用於我。但是,這可能是因爲我的設置錯誤。你知道如何通過默認的項目「ANGLE」或「D3D9」項目,這顯然是一個D3D11項目 – Dan