From c89524125370394f421735c565cb865125e9bab5 Mon Sep 17 00:00:00 2001 From: xxb-wzy Date: Sat, 19 Jul 2025 12:29:56 +0800 Subject: [PATCH] Signed-off-by: xxb-wzy Change-Id: Ibab72d32cf90efe2b1fba1b19c59abc8d254cb9f --- frameworks/core/common/window.h | 1 + .../gestures/recognizers/gesture_recognizer.h | 6 ++ .../gestures/recognizers/pan_recognizer.cpp | 12 +++ .../gestures/recognizers/pan_recognizer.h | 1 + .../pattern/list/list_pattern.cpp | 5 + .../components_ng/pattern/list/list_pattern.h | 1 + .../pattern/scrollable/scrollable.cpp | 26 +++++ .../pattern/scrollable/scrollable.h | 9 ++ .../pattern/scrollable/scrollable_pattern.cpp | 95 +++++++++++++++++++ .../pattern/scrollable/scrollable_pattern.h | 8 ++ .../render/adapter/rosen_window.cpp | 5 + .../render/adapter/rosen_window.h | 1 + frameworks/core/pipeline/pipeline_base.cpp | 7 ++ frameworks/core/pipeline/pipeline_base.h | 4 + .../core/pipeline_ng/pipeline_context.cpp | 23 +++++ .../core/pipeline_ng/pipeline_context.h | 4 + .../core/pipeline/mock_pipeline_context.cpp | 4 + 17 files changed, 212 insertions(+) diff --git a/frameworks/core/common/window.h b/frameworks/core/common/window.h index 1270452f85f..7367007e1c4 100644 --- a/frameworks/core/common/window.h +++ b/frameworks/core/common/window.h @@ -257,6 +257,7 @@ public: WidthBreakpoint GetWidthBreakpoint(const WidthLayoutBreakPoint& layoutBreakpoints) const; HeightBreakpoint GetHeightBreakpoint(const HeightLayoutBreakPoint& layoutBreakpoints) const; + virtual void SetDVSyncUpdate(uint64_t dvsyncTime) {} protected: bool isRequestVsync_ = false; bool onShow_ = true; diff --git a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h index afa17f63f74..b9892257160 100644 --- a/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/gesture_recognizer.h @@ -193,6 +193,11 @@ public: onActionStart_ = std::make_unique(onActionStart); } + void SetOnActionExtUpdate(const GestureEventFunc& onActionExtUpdate) + { + onActionExtUpdate_ = std::make_unique(onActionExtUpdate); + } + void SetOnActionUpdate(const GestureEventFunc& onActionUpdate) { onActionUpdate_ = std::make_unique(onActionUpdate); @@ -503,6 +508,7 @@ protected: std::unique_ptr onAction_; std::unique_ptr onActionStart_; std::unique_ptr onActionUpdate_; + std::unique_ptr onActionExtUpdate_; std::unique_ptr onActionEnd_; std::unique_ptr onActionCancel_; // triggered when the recongnizer is rejected diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp index 98cdcd7b4f5..fbba9545fca 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp @@ -292,6 +292,7 @@ void PanRecognizer::HandleTouchDownEvent(const TouchEvent& event) TAG_LOGI(AceLogTag::ACE_GESTURE, "Pan gesture refereeState is not READY"); } } + HandlePanExtAccept(); } void PanRecognizer::HandleTouchDownEvent(const AxisEvent& event) @@ -562,6 +563,16 @@ void PanRecognizer::HandleTouchMoveEvent(const AxisEvent& event) } } +bool PanRecognizer::HandlePanExtAccept() +{ + if (onActionExtUpdate_ && *onActionExtUpdate_) { + auto callbackFunction = *onActionExtUpdate_; + GestureEvent info = GetGestureEventInfo(); + callbackFunction(info); + } + return true; +} + bool PanRecognizer::HandlePanAccept() { if (gestureInfo_ && gestureInfo_->GetType() == GestureTypeName::DRAG) { @@ -992,6 +1003,7 @@ bool PanRecognizer::ReconcileFrom(const RefPtr& recognizer) onActionStart_ = std::move(curr->onActionStart_); onActionUpdate_ = std::move(curr->onActionUpdate_); + onActionExtUpdate_ = std::move(curr->onActionExtUpdate_); onActionEnd_ = std::move(curr->onActionEnd_); onActionCancel_ = std::move(curr->onActionCancel_); ReconcileGestureInfoFrom(recognizer); diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h index 26b90efc65b..9c53de6a0cb 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h @@ -163,6 +163,7 @@ private: double GetMainAxisDelta(); RefPtr GetDragEventActuator(); bool HandlePanAccept(); + bool HandlePanExtAccept(); void GetGestureEventHalfInfo(GestureEvent* info); GestureEvent GetGestureEventInfo(); void ResetDistanceMap(); diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.cpp b/frameworks/core/components_ng/pattern/list/list_pattern.cpp index 64732e3756e..51e0abc1479 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.cpp +++ b/frameworks/core/components_ng/pattern/list/list_pattern.cpp @@ -4332,4 +4332,9 @@ void ListPattern::UpdateGroupFocusIndexForDataChange(int32_t groupIndexInList, i } } } + +void ListPattern::ResetForExtScroll() +{ + currentDelta_ = 0; +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.h b/frameworks/core/components_ng/pattern/list/list_pattern.h index 24e953fc023..7b34e07675b 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.h +++ b/frameworks/core/components_ng/pattern/list/list_pattern.h @@ -628,6 +628,7 @@ private: void ProcessFocusEvent(bool indexChanged); void RequestFocusForItem(int32_t index, int32_t indexInGroup); RefPtr GetChildFocusHubInGroup(int32_t indexInList, int32_t indexInListItemGroup) const; + void ResetForExtScroll() override; std::optional focusIndex_; std::optional focusGroupIndex_; diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp index 83f52c4eb3b..1b50cf6a58d 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp @@ -185,6 +185,7 @@ void Scrollable::InitPanRecognizerNG() panRecognizerNG_->SetIsAllowMouse(false); SetOnActionStart(); SetOnActionUpdate(); + SetOnActionExtUpdate(); SetOnActionEnd(); SetOnActionCancel(); SetPanEndCallback(); @@ -201,6 +202,17 @@ void Scrollable::SetOnActionStart() panRecognizerNG_->SetOnActionStart(actionStart); } +void Scrollable::SetOnActionExtUpdate() +{ + CHECK_NULL_VOID(panRecognizerNG_); + auto actionExtUpdate = [weakScroll = AceType::WeakClaim(this)](const GestureEvent& info) { + auto scroll = weakScroll.Upgrade(); + CHECK_NULL_VOID(scroll); + scroll->HandleExtDragUpdate(); + }; + panRecognizerNG_->SetOnActionExtUpdate(actionExtUpdate); +} + void Scrollable::SetOnActionUpdate() { CHECK_NULL_VOID(panRecognizerNG_); @@ -588,6 +600,11 @@ void Scrollable::HandleScrollEnd(const std::optional& velocity) } } +void Scrollable::HandleExtDragUpdate() +{ + HandleExtScroll(); +} + void Scrollable::HandleDragStart(const OHOS::Ace::GestureEvent& info) { if (info.GetSourceTool() == SourceTool::TOUCHPAD) { @@ -647,6 +664,15 @@ void Scrollable::HandleDragStart(const OHOS::Ace::GestureEvent& info) } } +ScrollResult Scrollable::HandleExtScroll() +{ + if (handleExtScrollCallback_ != nullptr) { + // call NestableScrollContainer::HandleExtScroll + return handleExtScrollCallback_(); + } + return {0, false }; +} + ScrollResult Scrollable::HandleScroll(double offset, int32_t source, NestedState state) { if (!handleScrollCallback_) { diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable.h b/frameworks/core/components_ng/pattern/scrollable/scrollable.h index bd03432e5ed..50aa55a1ee8 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable.h @@ -201,9 +201,11 @@ public: void HandleTouchUp(); void HandleTouchCancel(); void HandleDragStart(const GestureEvent& info); + void HandleExtDragUpdate(); void HandleDragUpdate(const GestureEvent& info); void HandleDragEnd(const GestureEvent& info, bool isFromPanEnd = false); void HandleScrollEnd(const std::optional& velocity); + ScrollResult HandleExtScroll(); bool HandleOverScroll(double velocity); ScrollResult HandleScroll(double offset, int32_t source, NestedState state); void ProcessAxisUpdateEvent(float mainDelta, bool fromScrollBar = false); @@ -411,6 +413,10 @@ public: { overScrollCallback_ = std::move(func); } + void SetHandleExtScrollCallback(std::function&& func) + { + handleExtScrollCallback_ = std::move(func); + } void StartScrollAnimation(float mainPosition, float velocity, bool isScrollFromTouchPad = false); void SetOnScrollStartRec(std::function&& func) { @@ -603,6 +609,7 @@ private: void InitPanRecognizerNG(); void SetOnActionStart(); void SetOnActionUpdate(); + void SetOnActionExtUpdate(); void SetOnActionEnd(); void SetOnActionCancel(); void SetPanEndCallback(); @@ -695,6 +702,8 @@ private: std::function&)> onScrollEndRec_; // ScrollablePattern::RemainVelocityToChild RemainVelocityCallback remainVelocityCallback_; + // ScrollablePattern::HandleExtScroll + std::function handleExtScrollCallback_; EdgeEffect edgeEffect_ = EdgeEffect::NONE; bool canOverScroll_ = true; diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp index 194ece7d04a..e18d529c219 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp @@ -57,6 +57,9 @@ constexpr uint32_t MAX_VSYNC_DIFF_TIME = 100 * 1000 * 1000; //max 100ms constexpr uint32_t DEFAULT_VSYNC_DIFF_TIME = 16 * 1000 * 1000; // default is 16 ms constexpr uint32_t EVENTS_FIRED_INFO_COUNT = 50; constexpr uint32_t SCROLLABLE_FRAME_INFO_COUNT = 50; +constexpr uint32_t DVSYNC_OFFSET_SIZE = 10; +constexpr uint32_t DVSYNC_OFFSET_TIME = 18666667; +constexpr uint32_t DVSYNC_DELAY_TIME_BASE = 27000000; constexpr Dimension LIST_FADINGEDGE = 32.0_vp; constexpr double ARC_INITWIDTH_VAL = 4.0; constexpr double ARC_INITWIDTH_HALF_VAL = 2.0; @@ -489,6 +492,13 @@ bool ScrollablePattern::CoordinateWithNavigation(double& offset, int32_t source, return false; } +void ScrollablePattern::SetUiDVSyncCommandTime(uint64_t time) +{ + auto context = GetContext(); + CHECK_NULL_VOID(context); + context->SetUiDVSyncCommandTime(time); +} + void ScrollablePattern::SetUiDvsyncSwitch(bool on) { auto context = GetContext(); @@ -499,6 +509,7 @@ void ScrollablePattern::SetUiDvsyncSwitch(bool on) inScrollingStatus_ = false; context->SetUiDvsyncSwitch(true); switchOnStatus_ = true; + isNeedCollectOffset_ = true; } else if (!on && switchOnStatus_) { TAG_LOGI(AceLogTag::ACE_SCROLLABLE, "ScrollablePattern::SetUiDvsyncSwitch SetUiDvsyncSwitch false"); context->SetUiDvsyncSwitch(false); @@ -613,6 +624,20 @@ void ScrollablePattern::OnTouchTestDone(const std::shared_ptr& } } +void ScrollablePattern::SetHandleExtScrollCallback(const RefPtr& scrollable) +{ + // move HandleScroll and HandleOverScroll to ScrollablePattern by setting callbacks to scrollable + CHECK_NULL_VOID(scrollable); + auto handleScroll = [weak = AceType::WeakClaim(this)]() -> ScrollResult { + auto pattern = weak.Upgrade(); + if (pattern) { + return pattern->HandleExtScroll(pattern->GetVelocity()); + } + return {}; + }; + scrollable->SetHandleExtScrollCallback(std::move(handleScroll)); +} + void ScrollablePattern::SetHandleScrollCallback(const RefPtr& scrollable) { // move HandleScroll and HandleOverScroll to ScrollablePattern by setting callbacks to scrollable @@ -796,6 +821,7 @@ RefPtr ScrollablePattern::CreateScrollable() scrollable->SetNodeTag(host->GetTag()); scrollable->Initialize(host); SetHandleScrollCallback(scrollable); + SetHandleExtScrollCallback(scrollable); SetOverScrollCallback(scrollable); SetIsReverseCallback(scrollable); SetOnScrollStartRec(scrollable); @@ -2147,10 +2173,22 @@ bool ScrollablePattern::HandleScrollImpl(float offset, int32_t source) // Now: HandleScroll moved to ScrollablePattern, directly call HandleScrollImpl in // ScrollablePattern::HandleScroll + auto context = GetContext(); double overOffset = offset; if (!OnScrollPosition(overOffset, source)) { return false; } + if (isNeedCollectOffset_) { + uint64_t currentVsync = 0; + if (context != nullptr) { + currentVsync = context->GetVsyncTime(); + } + offsets_.push({currentVsync, offset}); + if (offsets_.size() > DVSYNC_OFFSET_SIZE) { + offsets_.pop(); + } + } + auto result = OnScrollCallback(overOffset, source); SelectOverlayScrollNotifier::NotifyOnScrollCallback(WeakClaim(this), overOffset, source); return result; @@ -2497,6 +2535,59 @@ bool ScrollablePattern::HandleOutBoundary(float& offset, int32_t source, NestedS return NearZero(offset); } +float ScrollablePattern::GetDVSyncOffset() +{ + auto context = GetContext(); + CHECK_NULL_RETURN(context, 0); + if (offsets_.empty() || !isNeedCollectOffset_) { + return 0; + } + uint64_t currentVsync = context->GetVsyncTime(); + uint64_t currentTime = GetSysTimestamp(); + bool needUpdateCommandTime = false; + if (currentVsync >= offsets_.back().first && currentVsync - currentTime > DVSYNC_DELAY_TIME_BASE) { + currentTime += DVSYNC_OFFSET_TIME; + needUpdateCommandTime = true; + } + uint64_t commandTime = 0; + float dvsyncOffset = 0; + if (!needUpdateCommandTime || currentTime >= currentVsync) { + return dvsyncOffset; + } + while (!offsets_.empty()) { + if (offsets_.front().first >= currentTime) { + dvsyncOffset -= offsets_.front().second; + if (commandTime == 0) { + commandTime = offsets_.front().first; + } + } + offsets_.pop(); + } + if (commandTime == 0) { + commandTime = currentTime; + } + std::queue> tmp; + std::swap(tmp, offsets_); + if (needUpdateCommandTime) { + AceScopedTrace aceScopedTrace("dvsyncTime %" PRIu64 " dvsyncOffset %f", commandTime, dvsyncOffset); + SetUiDVSyncCommandTime(commandTime); + isNeedCollectOffset_ = false; + } + return dvsyncOffset; +} + +ScrollResult ScrollablePattern::HandleExtScroll(float velocity) +{ + float dvsyncOffset = GetDVSyncOffset(); + if (dvsyncOffset != 0) { + isExtScroll_ = true; + HandleScroll(dvsyncOffset, SCROLL_FROM_ANIMATION, NestedState::CHILD_SCROLL, velocity); + isExtScroll_ = false; + } + ScrollResult result = { 0, true }; + return result; +} + ScrollResult ScrollablePattern::HandleScroll(float offset, int32_t source, NestedState state, float velocity) { ScrollResult result = { 0, false }; @@ -2530,6 +2621,10 @@ ScrollResult ScrollablePattern::HandleScroll(float offset, int32_t source, Neste initOffset, offset, source, state, GetCanOverScroll(), static_cast(host->GetAccessibilityId()), host->GetTag().c_str()); UpdateNestedScrollVelocity(offset, state); + if (isExtScroll_) { + ResetForExtScroll(); + isExtScroll_ = false; + } bool moved = HandleScrollImpl(offset, source); NotifyMoved(moved); return result; diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h index 49c513239f5..c22ab8d0042 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h @@ -1067,6 +1067,7 @@ private: /****************************************************************************** * NestableScrollContainer implementations */ + ScrollResult HandleExtScroll(float velocity = 0.f); ScrollResult HandleScroll( float offset, int32_t source, NestedState state = NestedState::GESTURE, float velocity = 0.f) override; bool HandleScrollVelocity(float velocity, const RefPtr& child = nullptr) override; @@ -1106,6 +1107,7 @@ private: void ProcessSpringEffect(float velocity, bool needRestart = false); void SetEdgeEffect(EdgeEffect edgeEffect); void SetHandleScrollCallback(const RefPtr& scrollable); + void SetHandleExtScrollCallback(const RefPtr& scrollable); void SetOverScrollCallback(const RefPtr& scrollable); void SetIsReverseCallback(const RefPtr& scrollable); void SetOnScrollStartRec(const RefPtr& scrollable); @@ -1140,10 +1142,12 @@ private: ModalSheetCoordinationMode CoordinateWithSheet(double& offset, int32_t source, bool isAtTop); bool NeedCoordinateScrollWithNavigation(double offset, int32_t source, const OverScrollOffset& overOffsets); void SetUiDvsyncSwitch(bool on); + void SetUiDVSyncCommandTime(uint64_t time); void SetNestedScrolling(bool nestedScrolling); void InitRatio(); void SetOnHiddenChangeForParent(); void ReportOnItemStopEvent(); + virtual void ResetForExtScroll() {}; Axis axis_ = Axis::VERTICAL; RefPtr scrollableEvent_; @@ -1230,6 +1234,7 @@ private: void HandleHotZone(const DragEventType& dragEventType, const RefPtr& notifyDragEvent); bool isVertical() const; void AddHotZoneSenceInterface(SceneStatus scene); + float GetDVSyncOffset(); RefPtr mouseEvent_; bool isMousePressed_ = false; RefPtr clickRecognizer_; @@ -1249,6 +1254,9 @@ private: bool backToTop_ = false; bool useDefaultBackToTop_ = true; bool isHitTestBlock_ = false; + std::queue> offsets_; + bool isExtScroll_ = false; + bool isNeedCollectOffset_ = false; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/render/adapter/rosen_window.cpp b/frameworks/core/components_ng/render/adapter/rosen_window.cpp index 8d82f01911b..54f17df44db 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_window.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_window.cpp @@ -394,4 +394,9 @@ void RosenWindow::NotifySnapshotUpdate() rsWindow_->NotifySnapshotUpdate(); } +void RosenWindow::SetDVSyncUpdate(uint64_t dvsyncTime) +{ + CHECK_NULL_VOID(rsUIDirector_); + rsUIDirector_->SetDVSyncUpdate(dvsyncTime); +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/render/adapter/rosen_window.h b/frameworks/core/components_ng/render/adapter/rosen_window.h index 93bdef07074..bad5e224e99 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_window.h +++ b/frameworks/core/components_ng/render/adapter/rosen_window.h @@ -148,6 +148,7 @@ public: void NotifySnapshotUpdate() override; + void SetDVSyncUpdate(uint64_t dvsyncTime) override; private: OHOS::sptr rsWindow_; WeakPtr taskExecutor_; diff --git a/frameworks/core/pipeline/pipeline_base.cpp b/frameworks/core/pipeline/pipeline_base.cpp index 77f8657629b..597d485c483 100644 --- a/frameworks/core/pipeline/pipeline_base.cpp +++ b/frameworks/core/pipeline/pipeline_base.cpp @@ -1134,4 +1134,11 @@ bool PipelineBase::CheckIfGetTheme() } return true; } + +void PipelineBase::SetUiDVSyncCommandTime(uint64_t vsyncTime) +{ + DVSyncChangeTime_ = vsyncTime; + commandTimeUpdate_ = true; + dvsyncTimeUpdate_ = true; +} } // namespace OHOS::Ace diff --git a/frameworks/core/pipeline/pipeline_base.h b/frameworks/core/pipeline/pipeline_base.h index 8299dd935d7..f0b73439071 100644 --- a/frameworks/core/pipeline/pipeline_base.h +++ b/frameworks/core/pipeline/pipeline_base.h @@ -1597,6 +1597,7 @@ public: return configurationChange_; } + void SetUiDVSyncCommandTime(uint64_t vsyncTime); protected: virtual bool MaybeRelease() override; void TryCallNextFrameLayoutCallback() @@ -1752,6 +1753,9 @@ protected: SerializedGesture serializedGesture_; RefPtr thpExtraMgr_; + uint64_t DVSyncChangeTime_ = 0; + bool commandTimeUpdate_ = false; + bool dvsyncTimeUpdate_ = false; private: void DumpFrontend() const; double ModifyKeyboardHeight(double keyboardHeight) const; diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 7340447aeec..2bd08aaa7a2 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -687,6 +687,27 @@ void PipelineContext::FlushDragEvents(const RefPtr& manager, nodeToPointEvent_ = std::move(nodeToPointEvent); } +void PipelineContext::UpdateDVSyncTime(uint64_t nanoTimestamp, const std::string& abilityName, uint64_t vsyncPeriod) +{ + if (nanoTimestamp < lastVSyncTime_) { + commandTimeUpdate_ = false; + } + if (commandTimeUpdate_) { + int64_t now = GetSysTimestamp(); + if (DVSyncChangeTime_ < now) { + commandTimeUpdate_ = false; + } + if (commandTimeUpdate_) { + window_->RecordFrameTime(DVSyncChangeTime_, abilityName); + if (dvsyncTimeUpdate_) { + window_->SetDVSyncUpdate(nanoTimestamp); + dvsyncTimeUpdate_ = false; + } + DVSyncChangeTime_ += vsyncPeriod; + } + } +} + void PipelineContext::FlushVsync(uint64_t nanoTimestamp, uint32_t frameCount) { CHECK_RUN_ON(UI); @@ -721,6 +742,8 @@ void PipelineContext::FlushVsync(uint64_t nanoTimestamp, uint32_t frameCount) auto hasRunningAnimation = FlushModifierAnimation(nanoTimestamp); FlushTouchEvents(); FlushDragEvents(); + UpdateDVSyncTime(nanoTimestamp, abilityName, vsyncPeriod); + lastVSyncTime_ = nanoTimestamp; FlushFrameCallbackFromCAPI(nanoTimestamp, frameCount); FlushBuild(); if (isFormRender_ && drawDelegate_ && rootNode_) { diff --git a/frameworks/core/pipeline_ng/pipeline_context.h b/frameworks/core/pipeline_ng/pipeline_context.h index 2ae5294a619..90d43b6869e 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.h +++ b/frameworks/core/pipeline_ng/pipeline_context.h @@ -1422,6 +1422,8 @@ private: void UpdateOcclusionCullingStatus(); + void UpdateDVSyncTime(uint64_t nanoTimestamp, const std::string& abilityName, uint64_t vsyncPeriod); + std::unique_ptr taskScheduler_ = std::make_unique(); std::unordered_map> scheduleTasks_; @@ -1613,6 +1615,8 @@ private: std::unordered_map keyOcclusionNodes_; RefPtr nodeRenderStatusMonitor_; Kit::ArkUIObjectLifecycleCallback objectLifecycleCallback_; + bool needUpdateTimeForDVSync_ = false; + uint64_t lastVSyncTime_ = 0; }; /** diff --git a/test/mock/core/pipeline/mock_pipeline_context.cpp b/test/mock/core/pipeline/mock_pipeline_context.cpp index 1bbd5d2ba2c..fe7ed7b17ab 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.cpp +++ b/test/mock/core/pipeline/mock_pipeline_context.cpp @@ -1323,6 +1323,10 @@ Dimension NG::PipelineContext::GetCustomTitleHeight() return Dimension(); } +void PipelineBase::SetUiDVSyncCommandTime(uint64_t vsyncTime) +{ +} + void PipelineBase::SetFontScale(float fontScale) { fontScale_ = fontScale; -- Gitee