From 05afa85a3a3320a688bcf276607c15a95743a9ba Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 27 Sep 2018 10:47:15 +0300 Subject: Fix constant CPU load when project contains qml files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ä Reviewed-by: Antti Määttä Reviewed-by: Mahmoud Badri --- src/Authoring/Studio/Application/StudioApp.cpp | 22 +++++++++++++++++++++- src/Authoring/Studio/Application/StudioApp.h | 3 +++ .../Studio/Palettes/Project/ProjectView.cpp | 15 +-------------- 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 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 #include #include -#include 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 +#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)) { -- cgit v1.2.3