diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-09-27 10:47:15 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-09-27 07:57:38 +0000 |
commit | 05afa85a3a3320a688bcf276607c15a95743a9ba (patch) | |
tree | f3e65728fa48802020689dcb6be4e605a839cb68 | |
parent | eda406902e1d7a08d482d05a9c715609f93ff7b2 (diff) |
Fix constant CPU load when project contains qml files
Checking whether a file is a behavior or qml stream is expensive, and
it was getting done continuously for some reason. Now we cache
the result of the first check for each file.
Task-number: QT3DS-2404
Change-Id: Iaf7fab48559790c6561ecf6b00d60febd68e6a08
Reviewed-by: Kimmo Leppälä <kimmo.leppala@qt.io>
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
-rw-r--r-- | src/Authoring/Studio/Application/StudioApp.cpp | 22 | ||||
-rw-r--r-- | src/Authoring/Studio/Application/StudioApp.h | 3 | ||||
-rw-r--r-- | src/Authoring/Studio/Palettes/Project/ProjectView.cpp | 15 | ||||
-rw-r--r-- | src/Authoring/Studio/Utils/ImportUtils.cpp | 13 |
4 files changed, 29 insertions, 24 deletions
diff --git a/src/Authoring/Studio/Application/StudioApp.cpp b/src/Authoring/Studio/Application/StudioApp.cpp index a5328c13..8a684b01 100644 --- a/src/Authoring/Studio/Application/StudioApp.cpp +++ b/src/Authoring/Studio/Application/StudioApp.cpp @@ -1754,7 +1754,27 @@ QString CStudioApp::getMostRecentProjectParentDir() const return parentDirectory; } -//============================================================================= +bool CStudioApp::isQmlStream(const QString &fileName) +{ + bool retval = false; + if (m_qmlStreamMap.contains(fileName)) { + retval = m_qmlStreamMap[fileName]; + } else { + if (!fileName.endsWith(QLatin1String(".qml"))) { + retval = false; + } else { + QQmlApplicationEngine qmlEngine(fileName); + if (qmlEngine.rootObjects().size() > 0) { + const char *rootClassName = qmlEngine.rootObjects().at(0) + ->metaObject()->superClass()->className(); + retval = strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0; + } + } + m_qmlStreamMap.insert(fileName, retval); + } + return retval; +} + /** * Called by OnLoadDocument, to allow the error reporting to be inserted. * Because of the nature of the error reporting, OnLoadDocument has to have diff --git a/src/Authoring/Studio/Application/StudioApp.h b/src/Authoring/Studio/Application/StudioApp.h index e91be9e8..0332618a 100644 --- a/src/Authoring/Studio/Application/StudioApp.h +++ b/src/Authoring/Studio/Application/StudioApp.h @@ -147,6 +147,7 @@ private: public: CMainFrame* m_pMainWnd; QWidget *m_lastActiveView = nullptr; + QHash<QString, bool> m_qmlStreamMap; CCore *GetCore(); CViews *GetViews(); @@ -264,6 +265,8 @@ public: void setLastActiveView(QWidget *widget) { m_lastActiveView = widget; } QWidget *lastActiveView() const { return m_lastActiveView; } + + bool isQmlStream(const QString &fileName); }; extern CStudioApp g_StudioApp; diff --git a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp index 6b7a5a49..fcfa8c2b 100644 --- a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp +++ b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp @@ -50,7 +50,6 @@ #include <QtQml/qqmlengine.h> #include <QtQml/qqmlfile.h> #include <QtQuick/qquickitem.h> -#include <QtQml/qqmlapplicationengine.h> ProjectView::ProjectView(const QSize &preferredSize, QWidget *parent) : QQuickWidget(parent) , m_ProjectModel(new ProjectFileSystemModel(this)) @@ -369,19 +368,7 @@ bool ProjectView::isPresentation(int row) const bool ProjectView::isQmlStream(int row) const { - const QString filePath = m_ProjectModel->filePath(row); - - if (!filePath.endsWith(QLatin1String(".qml"))) - return false; - - QQmlApplicationEngine qmlEngine(filePath); - if (qmlEngine.rootObjects().size() > 0) { - const char *rootClassName = qmlEngine.rootObjects().at(0) - ->metaObject()->superClass()->className(); - return strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0; - } else { - return false; - } + return g_StudioApp.isQmlStream(m_ProjectModel->filePath(row)); } bool ProjectView::isRefreshable(int row) const diff --git a/src/Authoring/Studio/Utils/ImportUtils.cpp b/src/Authoring/Studio/Utils/ImportUtils.cpp index 2bb4807c..933afe97 100644 --- a/src/Authoring/Studio/Utils/ImportUtils.cpp +++ b/src/Authoring/Studio/Utils/ImportUtils.cpp @@ -31,7 +31,7 @@ #include "ImportUtils.h" #include "Dialogs.h" #include "Qt3DSFileTools.h" -#include <QtQml/qqmlapplicationengine.h> +#include "StudioApp.h" namespace Q3DStudio { @@ -56,14 +56,9 @@ SObjectFileType ImportUtils::GetObjectFileTypeForFile(const CFilePath &inFile, DocumentEditorFileType::Image); // Drag-drop image to scene will auto-map to Rectangle. } else if (theExtension.Compare(CDialogs::GetQmlFileExtension(), Q3DStudio::CString::ENDOFSTRING, false)) { - QQmlApplicationEngine qmlEngine(inFile.absoluteFilePath()); - if (qmlEngine.rootObjects().size() > 0) { - const char *rootClassName = qmlEngine.rootObjects().at(0) - ->metaObject()->superClass()->className(); - bool isQmlStream = strcmp(rootClassName, "Q3DStudio::Q3DSQmlBehavior") != 0; - return isQmlStream ? SObjectFileType(OBJTYPE_QML_STREAM, DocumentEditorFileType::QmlStream) - : SObjectFileType(OBJTYPE_BEHAVIOR, DocumentEditorFileType::Behavior); - } // If qml file is invalid, it will be of unknown type + return g_StudioApp.isQmlStream(inFile.absoluteFilePath()) + ? SObjectFileType(OBJTYPE_QML_STREAM, DocumentEditorFileType::QmlStream) + : SObjectFileType(OBJTYPE_BEHAVIOR, DocumentEditorFileType::Behavior); } else if (CDialogs::IsFontFileExtension(theExtension)) { return SObjectFileType(OBJTYPE_TEXT, DocumentEditorFileType::Font); } else if (CDialogs::IsEffectFileExtension(theExtension)) { |