From 9f7a3bb2ffd3d89c65ffaef67792baf69705809e Mon Sep 17 00:00:00 2001 From: Zeya Peng Date: Wed, 22 Oct 2025 11:45:32 -0700 Subject: [PATCH] Allow passing down frameRateListenerCallback in cxx animated (#54142) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54142 ## Changelog: [Internal] [Added] - Allow passing down frameRateListenerCallback in cxx animated exposing `frameRateListenerCallback` to add instrumentation at animation frame and stop we're deferring the actual implementation of frame rate listening/logging to app/platform side Reviewed By: sammy-SC Differential Revision: D84510183 fbshipit-source-id: d8835542e8e50c5018032c951a510fec27b5a4d5 --- .../NativeAnimatedNodesManagerProvider.cpp | 31 +++++++++++--- .../NativeAnimatedNodesManagerProvider.h | 42 +++++++++++-------- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 7bdb273e246..1e7b48894c4 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -18,22 +18,42 @@ namespace facebook::react { -UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl() {} +UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl( + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback) + : frameRateListenerCallback_(std::move(frameRateListenerCallback)) {} void UIManagerNativeAnimatedDelegateImpl::runAnimationFrame() { if (auto nativeAnimatedNodesManagerStrong = nativeAnimatedNodesManager_.lock()) { + if (frameRateListenerCallback_) { + frameRateListenerCallback_(true); + } nativeAnimatedNodesManagerStrong->onRender(); } } NativeAnimatedNodesManagerProvider::NativeAnimatedNodesManagerProvider( StartOnRenderCallback startOnRenderCallback, - StopOnRenderCallback stopOnRenderCallback) + StopOnRenderCallback stopOnRenderCallback, + FrameRateListenerCallback frameRateListenerCallback) : eventEmitterListenerContainer_( std::make_shared()), - startOnRenderCallback_(std::move(startOnRenderCallback)), - stopOnRenderCallback_(std::move(stopOnRenderCallback)) {} + frameRateListenerCallback_(std::move(frameRateListenerCallback)), + startOnRenderCallback_(std::move(startOnRenderCallback)) { + if (frameRateListenerCallback_) { + stopOnRenderCallback_ = [this, stopOnRenderCallback]() { + if (stopOnRenderCallback) { + stopOnRenderCallback(); + } + if (frameRateListenerCallback_) { + frameRateListenerCallback_(false); + } + }; + } else { + stopOnRenderCallback_ = std::move(stopOnRenderCallback); + } +} std::shared_ptr NativeAnimatedNodesManagerProvider::getOrCreate( @@ -66,7 +86,8 @@ NativeAnimatedNodesManagerProvider::getOrCreate( }; nativeAnimatedDelegate_ = - std::make_shared(); + std::make_shared( + frameRateListenerCallback_); if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { #ifdef RN_USE_ANIMATION_BACKEND diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h index c02efd69187..9f170673f26 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h @@ -15,30 +15,17 @@ namespace facebook::react { class AnimatedMountingOverrideDelegate; -class UIManagerNativeAnimatedDelegateImpl - : public UIManagerNativeAnimatedDelegate { - public: - explicit UIManagerNativeAnimatedDelegateImpl(); - - void runAnimationFrame() override; - - void setNativeAnimatedNodesManager( - std::weak_ptr manager) { - nativeAnimatedNodesManager_ = manager; - } - - private: - std::weak_ptr nativeAnimatedNodesManager_; -}; - class NativeAnimatedNodesManagerProvider { public: + using FrameRateListenerCallback = + std::function; using StartOnRenderCallback = std::function&&)>; using StopOnRenderCallback = NativeAnimatedNodesManager::StopOnRenderCallback; NativeAnimatedNodesManagerProvider( StartOnRenderCallback startOnRenderCallback = nullptr, - StopOnRenderCallback stopOnRenderCallback = nullptr); + StopOnRenderCallback stopOnRenderCallback = nullptr, + FrameRateListenerCallback frameRateListenerCallback = nullptr); std::shared_ptr getOrCreate( jsi::Runtime& runtime, @@ -61,10 +48,31 @@ class NativeAnimatedNodesManagerProvider { std::shared_ptr animatedMountingOverrideDelegate_; + FrameRateListenerCallback frameRateListenerCallback_; StartOnRenderCallback startOnRenderCallback_; StopOnRenderCallback stopOnRenderCallback_; std::unique_ptr mergedValueDispatcher_; }; +class UIManagerNativeAnimatedDelegateImpl + : public UIManagerNativeAnimatedDelegate { + public: + explicit UIManagerNativeAnimatedDelegateImpl( + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback); + + void runAnimationFrame() override; + + void setNativeAnimatedNodesManager( + std::weak_ptr manager) { + nativeAnimatedNodesManager_ = manager; + } + + private: + std::weak_ptr nativeAnimatedNodesManager_; + NativeAnimatedNodesManagerProvider::FrameRateListenerCallback + frameRateListenerCallback_; +}; + } // namespace facebook::react