diff --git a/frameworks/core/pipeline_ng/ui_task_scheduler.cpp b/frameworks/core/pipeline_ng/ui_task_scheduler.cpp old mode 100755 new mode 100644 index 1a88336751ca9aa84d70c748e950c1f4c732f98c..7c26d0e86713205905575b169ab275e60d9afe91 --- a/frameworks/core/pipeline_ng/ui_task_scheduler.cpp +++ b/frameworks/core/pipeline_ng/ui_task_scheduler.cpp @@ -32,7 +32,7 @@ void UITaskScheduler::AddDirtyLayoutNode(const RefPtr& dirty) { CHECK_RUN_ON(UI); CHECK_NULL_VOID(dirty); - dirtyLayoutNodes_.emplace_back(dirty); + dirtyLayoutNodes_[dirty->GetPageId()].emplace(dirty); } void UITaskScheduler::AddDirtyRenderNode(const RefPtr& dirty) @@ -45,41 +45,52 @@ void UITaskScheduler::AddDirtyRenderNode(const RefPtr& dirty) } } +static inline bool Cmp(const RefPtr& nodeA, const RefPtr& nodeB) +{ + if (!nodeA || !nodeB) { + return false; + } + return nodeA->GetLayoutPriority() > nodeB->GetLayoutPriority(); +} + void UITaskScheduler::FlushLayoutTask(bool forceUseMainThread) { CHECK_RUN_ON(UI); ACE_FUNCTION_TRACE(); isLayouting_ = true; auto dirtyLayoutNodes = std::move(dirtyLayoutNodes_); - - RootDirtyMap dirtyLayoutNodesMap; - for (auto&& dirty : dirtyLayoutNodes) { - dirtyLayoutNodesMap[dirty->GetPageId()].emplace(dirty); - } - - // Priority task creation - int64_t time = 0; - for (auto&& pageNodes : dirtyLayoutNodesMap) { + std::vector> orderedNodes; + for (auto&& pageNodes : dirtyLayoutNodes) { for (auto&& node : pageNodes.second) { - // need to check the node is destroying or not before CreateLayoutTask if (!node || node->IsInDestroying()) { continue; } - time = GetSysTimestamp(); - auto task = node->CreateLayoutTask(forceUseMainThread); - if (task) { - if (forceUseMainThread || (task->GetTaskThreadType() == MAIN_TASK)) { - (*task)(); - time = GetSysTimestamp() - time; + orderedNodes.emplace_back(node); + } + } + std::sort(orderedNodes.begin(), orderedNodes.end(), Cmp); - } else { - LOGW("need to use multithread feature"); - } - } - if (frameInfo_ != nullptr) { - frameInfo_->AddTaskInfo(node->GetTag(), node->GetId(), time, FrameInfo::TaskType::LAYOUT); + // Priority task creation + int64_t time = 0; + for (auto& node : orderedNodes) { + // need to check the node is destroying or not before CreateLayoutTask + if (!node || node->IsInDestroying()) { + continue; + } + time = GetSysTimestamp(); + frameId_++; + auto task = node->CreateLayoutTask(forceUseMainThread); + if (task) { + if (forceUseMainThread || (task->GetTaskThreadType() == MAIN_TASK)) { + (*task)(); + time = GetSysTimestamp() - time; + } else { + LOGW("need to use multithread feature"); } } + if (frameInfo_ != nullptr) { + frameInfo_->AddTaskInfo(node->GetTag(), node->GetId(), time, FrameInfo::TaskType::LAYOUT); + } } isLayouting_ = false; } @@ -123,13 +134,7 @@ bool UITaskScheduler::NeedAdditionalLayout() { bool ret = false; ElementRegister::GetInstance()->ReSyncGeometryTransition(); - - RootDirtyMap dirtyLayoutNodesMap; - for (auto&& dirty : dirtyLayoutNodes_) { - dirtyLayoutNodesMap[dirty->GetPageId()].emplace(dirty); - } - - for (auto&& pageNodes : dirtyLayoutNodesMap) { + for (auto&& pageNodes : dirtyLayoutNodes_) { for (auto&& node : pageNodes.second) { if (!node || !node->GetLayoutProperty()) { continue; diff --git a/frameworks/core/pipeline_ng/ui_task_scheduler.h b/frameworks/core/pipeline_ng/ui_task_scheduler.h old mode 100755 new mode 100644 index 5498a0e17b0114c09871485208ea10a26830ff1c..289020b6be15c876ac742e0ac0b6ee5bd111c80c --- a/frameworks/core/pipeline_ng/ui_task_scheduler.h +++ b/frameworks/core/pipeline_ng/ui_task_scheduler.h @@ -125,23 +125,20 @@ private: if (!nodeLeft || !nodeRight) { return false; } - if (nodeLeft->GetLayoutPriority() == nodeRight->GetLayoutPriority()) { - if (nodeLeft->GetDepth() < nodeRight->GetDepth()) { - return true; - } - if (nodeLeft->GetDepth() == nodeRight->GetDepth()) { - return nodeLeft < nodeRight; - } - return false; + if (nodeLeft->GetDepth() < nodeRight->GetDepth()) { + return true; + } + if (nodeLeft->GetDepth() == nodeRight->GetDepth()) { + return nodeLeft < nodeRight; } - return nodeLeft->GetLayoutPriority() > nodeRight->GetLayoutPriority(); + return false; } }; using PageDirtySet = std::set, NodeCompare>>; using RootDirtyMap = std::map; - std::list> dirtyLayoutNodes_; + RootDirtyMap dirtyLayoutNodes_; RootDirtyMap dirtyRenderNodes_; std::list predictTask_; std::list> afterLayoutTasks_; diff --git a/test/unittest/core/pipeline/pipeline_context_test_ng.cpp b/test/unittest/core/pipeline/pipeline_context_test_ng.cpp index 7c4eca05bc2994b52b23e2f592836ca8257f10c7..77b0812a2018eb42d8f5ff3f00cefbb92344a621 100644 --- a/test/unittest/core/pipeline/pipeline_context_test_ng.cpp +++ b/test/unittest/core/pipeline/pipeline_context_test_ng.cpp @@ -292,6 +292,7 @@ HWTEST_F(PipelineContextTestNg, PipelineContextTestNg003, TestSize.Level1) * FlushLayoutTask and FlushRenderTask of the UITaskScheduler. */ context_->taskScheduler_->AddDirtyLayoutNode(frameNode_); + context_->taskScheduler_->dirtyLayoutNodes_[frameNode_->GetPageId()].emplace(nullptr); context_->taskScheduler_->AddDirtyRenderNode(frameNode_); context_->taskScheduler_->dirtyRenderNodes_[frameNode_->GetPageId()].emplace(nullptr); @@ -1995,6 +1996,7 @@ HWTEST_F(PipelineContextTestNg, UITaskSchedulerTestNg001, TestSize.Level1) * @tc.expected: frame info not record. */ taskScheduler.AddDirtyLayoutNode(frameNode); + taskScheduler.dirtyLayoutNodes_[1].emplace(nullptr); taskScheduler.AddDirtyLayoutNode(frameNode2); taskScheduler.FlushLayoutTask(false); EXPECT_EQ(frameInfo.layoutInfos_.size(), 1); @@ -2118,6 +2120,7 @@ HWTEST_F(PipelineContextTestNg, UITaskSchedulerTestNg004, TestSize.Level1) * @tc.expected: NeedAdditionalLayout return false. */ taskScheduler.AddDirtyLayoutNode(frameNode); + taskScheduler.dirtyLayoutNodes_[1].emplace(nullptr); taskScheduler.AddDirtyLayoutNode(frameNode2); EXPECT_FALSE(taskScheduler.NeedAdditionalLayout());