From d8951711c3f5a2f52c24715f15f9a446ca7ae755 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 11 May 2018 14:34:55 +0300 Subject: Optimize iterating through child objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GetAssetChildrenInTimeParent was getting called unnecessarily much, as it was called every time GetChildrenCount or GetChild was called. According to profiling it was responsible for vast majority of the time spent when changing a slide. Optimized various loops that iterate through object's children to only call this function once. Task-number: QT3DS-1601 Change-Id: Ia006acb76bd818c390a36f6fe9f1656660974c0e Reviewed-by: Antti Määttä Reviewed-by: Jere Tuliniemi Reviewed-by: Kaj Grönholm Reviewed-by: Tomi Korpipää --- .../Bindings/Qt3DSDMTimelineItemBinding.cpp | 41 ++++++++++++++++------ 1 file changed, 30 insertions(+), 11 deletions(-) (limited to 'src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp') diff --git a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp index dd2989fa..9592b8ba 100644 --- a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp +++ b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp @@ -180,13 +180,10 @@ void ToggleChildrenLock(Q3DStudio::ScopedDocumentEditor &scopedDocEditor, { scopedDocEditor->SetInstancePropertyValue(inTimelineItemBinding->GetInstanceHandle(), inSceneAsset.m_Locked, inLocked); - long childrenCount = inTimelineItemBinding->GetChildrenCount(); - if (childrenCount == 0) - return; - for (long i = 0; i < childrenCount; ++i) { - Qt3DSDMTimelineItemBinding *child = - static_cast(inTimelineItemBinding->GetChild(i)); - ToggleChildrenLock(scopedDocEditor, child, inSceneAsset, inLocked); + const QList children = inTimelineItemBinding->GetChildren(); + for (auto child : children) { + ToggleChildrenLock(scopedDocEditor, static_cast(child), + inSceneAsset, inLocked); } } @@ -466,6 +463,29 @@ ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetChild(long inIndex) return nullptr; } +QList Qt3DSDMTimelineItemBinding::GetChildren() +{ + QList retlist; + qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); + if (theInstance.Valid()) { + Q3DStudio::CGraphIterator theChildren; + Qt3DSDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide(); + GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(), + theChildren, theActiveSlide); + int childCount = int(theChildren.GetCount()); + retlist.reserve(childCount); + + for (int i = 0; i < childCount; ++i) { + qt3dsdm::Qt3DSDMInstanceHandle theChildInstance = theChildren.GetCurrent(); + if (theChildInstance.Valid()) + retlist.append(m_TransMgr->GetOrCreate(theChildInstance)); + ++theChildren; + } + } + + return retlist; +} + ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetParent() { return m_Parent; @@ -890,11 +910,10 @@ void Qt3DSDMTimelineItemBinding::RefreshStateRow(bool inRefreshChildren) theRow->OnTimeChange(); theRow->setDirty(false); if (inRefreshChildren) { - long theChildrenCount = GetChildrenCount(); - for (long theIndex = 0; theIndex < theChildrenCount; ++theIndex) { - ITimelineItemBinding *theChild = GetChild(theIndex); + const QList children = GetChildren(); + for (auto child : children) { Qt3DSDMTimelineItemBinding *theBinding = - dynamic_cast(theChild); + static_cast(child); if (theBinding) theBinding->RefreshStateRow(inRefreshChildren); } -- cgit v1.2.3