From 195dbe8003b571a6b8b2fd32822b13291c92d7e1 Mon Sep 17 00:00:00 2001 From: liwenzhen Date: Sat, 23 Aug 2025 19:50:44 +0800 Subject: [PATCH] remove from dirty Signed-off-by: liwenzhen --- .../declarative_frontend/jsview/js_view.cpp | 6 +++++ .../declarative_frontend/jsview/js_view.h | 2 ++ .../src/lib/puv2_common/puv2_view_base.ts | 9 +++++++- .../puv2_common/puv2_view_native_base.d.ts | 1 + .../base/view_partial_update_model.h | 1 + .../base/view_partial_update_model_ng.cpp | 10 ++++++++ .../base/view_partial_update_model_ng.h | 2 ++ .../pattern/custom/custom_node_base.cpp | 11 +++++++++ .../pattern/custom/custom_node_base.h | 1 + .../core/pipeline_ng/pipeline_context.cpp | 23 +++++++++++++++++++ .../core/pipeline_ng/pipeline_context.h | 2 ++ .../core/pipeline/mock_pipeline_context.cpp | 2 ++ 12 files changed, 69 insertions(+), 1 deletion(-) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view.cpp index 95e5898bf77..6791d75c811 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view.cpp @@ -978,6 +978,11 @@ void JSViewPartialUpdate::MarkNeedUpdate() needsUpdate_ = ViewPartialUpdateModel::GetInstance()->MarkNeedUpdate(viewNode_); } +void JSViewPartialUpdate::RemoveFromDirtyList() +{ + ViewPartialUpdateModel::GetInstance()->RemoveFromDirtyList(viewNode_); +} + /** * in JS View.create(new View(...)); * used for FullRender case, not for re-render case @@ -1278,6 +1283,7 @@ void JSViewPartialUpdate::JSBind(BindingTarget object) JSClass::StaticMethod("create", &JSViewPartialUpdate::Create, opt); JSClass::StaticMethod("createRecycle", &JSViewPartialUpdate::CreateRecycle, opt); JSClass::Method("markNeedUpdate", &JSViewPartialUpdate::MarkNeedUpdate); + JSClass::Method("removeFromDirtyList", &JSViewPartialUpdate::RemoveFromDirtyList); JSClass::Method("syncInstanceId", &JSViewPartialUpdate::SyncInstanceId); JSClass::Method("restoreInstanceId", &JSViewPartialUpdate::RestoreInstanceId); JSClass::CustomMethod("getInstanceId", &JSViewPartialUpdate::GetInstanceId); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view.h b/frameworks/bridge/declarative_frontend/jsview/js_view.h index 5570092061c..48e4151493b 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_view.h @@ -455,6 +455,8 @@ public: private: void MarkNeedUpdate() override; + void RemoveFromDirtyList(); + // indicates if the JSView has ever completed initial render // used for code branching in lambda given to ComposedComponent // render callback diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts index b39ddf54fb6..4eb6b551459 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_base.ts @@ -140,6 +140,10 @@ abstract class PUV2ViewBase extends ViewBuildNodeBase { public markNeedUpdate(): void { return this.nativeViewPartialUpdate.markNeedUpdate(); } + + public removeFromDirtyList(): void { + return this.nativeViewPartialUpdate.removeFromDirtyList(); + } public syncInstanceId(): void { return this.nativeViewPartialUpdate.syncInstanceId(); @@ -402,7 +406,10 @@ abstract class PUV2ViewBase extends ViewBuildNodeBase { ObserveV2.getObserve()?.runIdleTasks(); // to avoid to run the update func twice // it is not necessary to save dirty nodes, because it wll update all the element soon - this.dirtDescendantElementIds_.clear(); + if (this.dirtDescendantElementIds_.size > 0) { + this.removeFromDirtyList(); + this.dirtDescendantElementIds_.clear(); + } Array.from(this.updateFuncByElmtId.keys()).sort(ViewPU.compareNumber).forEach(elmtId => this.UpdateElement(elmtId)); diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_native_base.d.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_native_base.d.ts index 0bb8526fa8a..05140b0c966 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_native_base.d.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_view_native_base.d.ts @@ -21,6 +21,7 @@ declare class NativeViewPartialUpdate { constructor(thisObj: object); markNeedUpdate(): void; + removeFromDirtyList(): void; findChildById(compilerAssignedUniqueChildId: string): View; syncInstanceId(): void; isFirstRender(): boolean; diff --git a/frameworks/core/components_ng/base/view_partial_update_model.h b/frameworks/core/components_ng/base/view_partial_update_model.h index f93688ad9a3..192210d942c 100644 --- a/frameworks/core/components_ng/base/view_partial_update_model.h +++ b/frameworks/core/components_ng/base/view_partial_update_model.h @@ -76,6 +76,7 @@ public: virtual RefPtr CreateNode(NodeInfoPU&& info) = 0; virtual bool MarkNeedUpdate(const WeakPtr& node) = 0; + virtual void RemoveFromDirtyList(const WeakPtr &node) {}; virtual void FlushUpdateTask(const UpdateTask& task) = 0; virtual void FinishUpdate( const WeakPtr& viewNode, int32_t id, std::function&& emplaceTaskFunc) = 0; diff --git a/frameworks/core/components_ng/base/view_partial_update_model_ng.cpp b/frameworks/core/components_ng/base/view_partial_update_model_ng.cpp index fc40ded1287..725c0a05758 100644 --- a/frameworks/core/components_ng/base/view_partial_update_model_ng.cpp +++ b/frameworks/core/components_ng/base/view_partial_update_model_ng.cpp @@ -103,6 +103,16 @@ bool ViewPartialUpdateModelNG::MarkNeedUpdate(const WeakPtr& node) return true; } +void ViewPartialUpdateModelNG::RemoveFromDirtyList(const WeakPtr& node) +{ + auto weakNode = AceType::DynamicCast(node); + auto customNode = weakNode.Upgrade(); + if (!customNode) { + LOGW("cannot remove from dirty list, customNode is invalid"); + } + customNode->RemoveFromDirtyList(); +} + void ViewPartialUpdateModelNG::FinishUpdate( const WeakPtr& viewNode, int32_t id, std::function&& emplaceTaskFunc) { diff --git a/frameworks/core/components_ng/base/view_partial_update_model_ng.h b/frameworks/core/components_ng/base/view_partial_update_model_ng.h index 28c38e0998d..3f3566687cd 100644 --- a/frameworks/core/components_ng/base/view_partial_update_model_ng.h +++ b/frameworks/core/components_ng/base/view_partial_update_model_ng.h @@ -31,6 +31,8 @@ public: bool MarkNeedUpdate(const WeakPtr& node) override; + void RemoveFromDirtyList(const WeakPtr& node) override; + void FlushUpdateTask(const UpdateTask& task) override {} void FinishUpdate(const WeakPtr& viewNode, int32_t id, diff --git a/frameworks/core/components_ng/pattern/custom/custom_node_base.cpp b/frameworks/core/components_ng/pattern/custom/custom_node_base.cpp index 9b7418c8052..c719c4b98c3 100644 --- a/frameworks/core/components_ng/pattern/custom/custom_node_base.cpp +++ b/frameworks/core/components_ng/pattern/custom/custom_node_base.cpp @@ -282,6 +282,17 @@ void CustomNodeBase::MarkNeedUpdate() context->AddDirtyCustomNode(AceType::DynamicCast(Claim(this))); } +void CustomNodeBase::RemoveFromDirtyList() +{ + auto context = PipelineContext::GetCurrentContext(); + if (!context) { + TAG_LOGW(AceLogTag::ACE_STATE_MGMT, "context no longer exist when [%{public}s] call RemoveFromDirtyList", + GetJSViewName().c_str()); + return; + } + context->RemoveFromDirtyList(AceType::DynamicCast(Claim(this))); +} + void CustomNodeBase::FireRecycleSelf() { auto uiNode = AceType::DynamicCast(Claim(this)); diff --git a/frameworks/core/components_ng/pattern/custom/custom_node_base.h b/frameworks/core/components_ng/pattern/custom/custom_node_base.h index f9d3b0e0a8a..924344c444e 100644 --- a/frameworks/core/components_ng/pattern/custom/custom_node_base.h +++ b/frameworks/core/components_ng/pattern/custom/custom_node_base.h @@ -74,6 +74,7 @@ public: void Update(); // called by pipeline in js thread of update. void MarkNeedUpdate(); // called by view in js thread + void RemoveFromDirtyList(); // called by view in js thread // called for Component reuse void ResetRecycle(); diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 75da308368b..b6dc51f7c65 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -356,6 +356,29 @@ void PipelineContext::AddDirtyCustomNode(const RefPtr& dirtyNode) RequestFrame(); } +void PipelineContext::RemoveFromDirtyList(const RefPtr& dirtyNode) +{ + CHECK_RUN_ON(UI); + if (!dirtyNode) { + LOGW("dirtyNode invalid"); + return; + } + auto customNode = DynamicCast(dirtyNode); + if (customNode && !dirtyNode->GetInspectorIdValue("").empty()) { + ACE_BUILD_TRACE_BEGIN("RemoveFromDirtyList[%s][self:%d][parent:%d][key:%s]", + customNode->GetJSViewName().c_str(), + dirtyNode->GetId(), dirtyNode->GetParent() ? dirtyNode->GetParent()->GetId() : 0, + dirtyNode->GetInspectorIdValue("").c_str()); + ACE_BUILD_TRACE_END() + } else if (customNode) { + ACE_BUILD_TRACE_BEGIN("RemoveFromDirtyList[%s][self:%d][parent:%d]", + customNode->GetJSViewName().c_str(), + dirtyNode->GetId(), dirtyNode->GetParent() ? dirtyNode->GetParent()->GetId() : 0); + ACE_BUILD_TRACE_END() + } + dirtyNodes_.erase(dirtyNode); +} + void PipelineContext::AddDirtyLayoutNode(const RefPtr& dirty) { CHECK_RUN_ON(UI); diff --git a/frameworks/core/pipeline_ng/pipeline_context.h b/frameworks/core/pipeline_ng/pipeline_context.h index 36d77b6c5ec..3b8ecb81321 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.h +++ b/frameworks/core/pipeline_ng/pipeline_context.h @@ -384,6 +384,8 @@ public: void AddDirtyCustomNode(const RefPtr& dirtyNode); + void RemoveFromDirtyList(const RefPtr& dirtyNode); + void AddDirtyLayoutNode(const RefPtr& dirty); void AddIgnoreLayoutSafeAreaBundle(IgnoreLayoutSafeAreaBundle&& bundle); diff --git a/test/mock/core/pipeline/mock_pipeline_context.cpp b/test/mock/core/pipeline/mock_pipeline_context.cpp index 70a24f16b86..7eae258d3fa 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.cpp +++ b/test/mock/core/pipeline/mock_pipeline_context.cpp @@ -826,6 +826,8 @@ bool PipelineContext::GetRestoreInfo(int32_t restoreId, std::string& restoreInfo void PipelineContext::AddDirtyCustomNode(const RefPtr& dirtyNode) {} +void PipelineContext::RemoveFromDirtyList(const RefPtr& dirtyNode) {} + void PipelineContext::SetFlushTSUpdates(std::function&& flushTSUpdates) {} void PipelineContext::AddWindowSizeChangeCallback(int32_t nodeId) {} -- Gitee