我正在开发一个Qt应用程序,其中用户可以在QGraphicsScene中添加QML对象。列出了可用的QML对象,用户可以添加任意数量的对象。
直到现在,我使用QQuickWidgets。QGraphicsScene包含一个顶级小部件,它是我创建的所有QQuickWidgets的父部件。它工作得很好,但我有一个性能问题。如果对象数量太多,应用程序就会开始变慢,并且占用太多的RAM空间(我创建的第一个示例超过1.5 GB,包含400个对象)。
我认为它来自QQuickWidgets由Qt处理的方式,并想尝试另一种方式,与QQuickViews。为此,我创建了一个根视图,在QWidget中进行转换,以便将其嵌入到我的视图中,这是一个QWidget。然后我在根视图中为每个创建的对象添加一个新的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);
创建表示对象的qquickview:
QQuickView *view = new QQuickView(_engine, _rootView);
view->setSource(url);
view->setResizeMode(QQuickView::SizeViewToRootObject);
view->show();
它工作,但问题是,每个QQuickView创建自己的线程,这不会改变我处理它的方式,但发生在内存中。我不明白为什么,因为我把它们表示为根视图。
所以我的问题如下:
1 -有没有办法防止QQuickViews创建自己的线程?
2 -是否使用QQuickViews,确实,更少的内存消耗比使用QQuickWidgets ?
3 -如果没有,我如何处理在QWidget视图中添加大量QML对象而不消耗太多内存?
我认为使用多个qquickview是一个坏主意。一个应用程序通常只需要一个。我会看一下QQmlComponent。下面是一个例子:
QQmlComponent component(_engine, QUrl::fromLocalFile("MyItem.qml"));
QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
childItem->setParentItem(_rootView);
我绝不是QML专家。然而,这里有一些我能想到的指针
- 避免混用和匹配QQuick: widget/View. 考虑动态创建对象
- 你也可以使用loader,但是它们有少量额外的开销。
- 考虑使用堆栈/滑动视图之类的东西来最小化加载对象的数量。
为了获得最佳投资回报率,我首先尝试实现堆栈视图之类的东西,看看它对RAM有多大帮助。然后根据需要动态创建其他对象。
最后,我认为QT有一个工具可以让您在运行时看到QML树的内存量。您可以查看它并查看最大的内存消耗在哪里。