diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-05-11 14:34:55 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2018-05-14 07:44:08 +0000 |
commit | d8951711c3f5a2f52c24715f15f9a446ca7ae755 (patch) | |
tree | 247fbb9a2ec323d6d7a825c86131b1ab4a15a797 /src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp | |
parent | 4f3612e4c2c79ec61269de8581138b44267608b5 (diff) |
Optimize iterating through child objects
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ä <antti.maatta@qt.io>
Reviewed-by: Jere Tuliniemi <jere.tuliniemi@qt.io>
Reviewed-by: Kaj Grönholm <kaj.gronholm@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp')
-rw-r--r-- | src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp | 41 |
1 files changed, 30 insertions, 11 deletions
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<Qt3DSDMTimelineItemBinding *>(inTimelineItemBinding->GetChild(i)); - ToggleChildrenLock(scopedDocEditor, child, inSceneAsset, inLocked); + const QList<ITimelineItemBinding *> children = inTimelineItemBinding->GetChildren(); + for (auto child : children) { + ToggleChildrenLock(scopedDocEditor, static_cast<Qt3DSDMTimelineItemBinding *>(child), + inSceneAsset, inLocked); } } @@ -466,6 +463,29 @@ ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetChild(long inIndex) return nullptr; } +QList<ITimelineItemBinding *> Qt3DSDMTimelineItemBinding::GetChildren() +{ + QList<ITimelineItemBinding *> 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<ITimelineItemBinding *> children = GetChildren(); + for (auto child : children) { Qt3DSDMTimelineItemBinding *theBinding = - dynamic_cast<Qt3DSDMTimelineItemBinding *>(theChild); + static_cast<Qt3DSDMTimelineItemBinding *>(child); if (theBinding) theBinding->RefreshStateRow(inRefreshChildren); } |