簡體   English   中英

使用 QQuickView 或 QQuickWidget 在 QWidget 應用程序中添加大量 QML 對象會帶來性能問題

[英]Adding a high number of QML objects in a QWidget application using QQuickView or QQuickWidget poses performance problem

我正在開發一個 Qt 應用程序,用戶可以在其中的 QGraphicsScene 中添加 QML 個對象。 列出了可用的 QML 個對象,用戶可以添加任意數量的對象。

到目前為止,我使用的是 QQuickWidgets。 QGraphicsScene 包含一個頂級小部件,它是我創建的所有 QQuickWidgets 的父級。 它工作正常,但我遇到了性能問題。 對於大量對象,應用程序開始變慢,並在 RAM 中占用過多空間(我創建的第一個示例超過 1.5 GB,包含 400 個對象)。

我認為它來自 Qt 處理 QQuickWidgets 的方式,並想嘗試另一種方式,使用 QQuickViews。 為此,我創建了一個根視圖,在 QWidget 中進行了轉換,以便我可以將它嵌入到我的視圖中,這是一個 QWidget。 然后我在根視圖中為每個創建的 object 添加一個新的 QQuickView。

根視圖、其容器和引擎的創建:

    _rootView = new QQuickWindow();
    _rootView->resize(1024, 720);
    _rootView->show();

    QWidget *container = QWidget::createWindowContainer(_rootView, this);
    container->resize(_rootView->size());
    container->setObjectName("TopLevelQmlViewWidget");
    _layout->addWidget(container);

    _engine = new QQmlEngine(_rootView);

創建代表對象的 QQuickViews:

    QQuickView *view = new QQuickView(_engine, _rootView);
    view->setSource(url);
    view->setResizeMode(QQuickView::SizeViewToRootObject);
    view->show();

它有效,但問題是每個 QQuickView 創建自己的線程,這不會改變我處理它的方式但發生在 memory 中。我不明白為什么,因為我將它們重新設置為根視圖。

所以我的問題如下:

1 - 有沒有辦法阻止 QQuickViews 創建自己的線程?

2 - 使用 QQuickViews 確實比使用 QQuickWidgets 消耗更少的內存嗎?

3 - 如果不是,我如何在不消耗太多 memory 的情況下處理在 QWidget 視圖中添加大量 QML 對象?

我認為使用多個 QQuickViews 是個壞主意。 一個應用程序通常只需要一個。 我會看一下QQmlComponent 這是一個例子:

QQmlComponent component(_engine, QUrl::fromLocalFile("MyItem.qml"));
QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
childItem->setParentItem(_rootView);

我絕不是 QML 專家。 但是,這里有一些我能想到的建議

  1. 避免混合和匹配 QQuick:widget/View。
  2. 考慮動態創建對象
  3. 考慮使用類似堆棧/滑動視圖的東西來最小化加載對象的數量。

為了獲得最佳投資回報率,我會首先嘗試實現堆棧視圖之類的東西,看看它對 RAM 有多大幫助。 然后 go 就可以根據需要動態創建其他對象。

最后我認為 QT 有一個工具可以讓你在運行時看到 QML 樹的 memory 的數量。 你可以看看那個,看看你最大的 memory 豬在哪里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM