From 3f396616d20beaebeb1fa7ab35deebc195bbcd2b Mon Sep 17 00:00:00 2001 From: Bartlomiej Bloniarz Date: Wed, 1 Oct 2025 04:15:11 -0700 Subject: [PATCH] Init the backend closer to the uiManager (#53996) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/53996 ## Summary This diff makes changes to the `NativeAnimatedNodesManager` and `AnimationBackend` to initialize the backend closer to the `UIManager`. ## Changelog: [GENERAL] [CHANGED] - initialize the backend in NativeAnimatedNodesManagerProvider Reviewed By: sammy-SC Differential Revision: D81138133 fbshipit-source-id: 5be0c8d5f5e3593bcd8111bbd1d0e90502a53a0d --- .../animated/NativeAnimatedNodesManager.cpp | 26 +++++++------------ .../animated/NativeAnimatedNodesManager.h | 3 +++ .../NativeAnimatedNodesManagerProvider.cpp | 22 ++++++++++++---- .../NativeAnimatedNodesManagerProvider.h | 1 + .../animationbackend/AnimationBackend.cpp | 12 ++++----- .../animationbackend/AnimationBackend.h | 12 ++++----- 6 files changed, 43 insertions(+), 33 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp index 725d424519a..e055ee94cc0 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp @@ -89,15 +89,12 @@ NativeAnimatedNodesManager::NativeAnimatedNodesManager( LOG(ERROR) << "C++ Animated was setup without a way to update UI. Animations will not work."; } - if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { - // shouldn't be initialized here, but it's convenient for now - animationBackend_ = std::make_shared( - startOnRenderCallback_, - stopOnRenderCallback_, - directManipulationCallback_); - } } +NativeAnimatedNodesManager::NativeAnimatedNodesManager( + std::shared_ptr animationBackend) noexcept + : animationBackend_(std::move(animationBackend)) {} + NativeAnimatedNodesManager::~NativeAnimatedNodesManager() noexcept { stopRenderCallbackIfNeeded(); } @@ -854,6 +851,11 @@ void NativeAnimatedNodesManager::schedulePropsCommit( const folly::dynamic& props, bool layoutStyleUpdated, bool forceFabricCommit) noexcept { + if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { + mergeObjects(updateViewProps_[viewTag], props); + return; + } + // When fabricCommitCallback_ & directManipulationCallback_ are both // available, we commit layout props via Fabric and the other using direct // manipulation. If only fabricCommitCallback_ is available, we commit all @@ -909,6 +911,7 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations() { auto timestamp = static_cast(microseconds) / 1000.0; bool containsChange = false; { + // copied from onAnimationFrame // Run all active animations auto hasFinishedAnimations = false; std::set finishedAnimationValueNodes; @@ -951,11 +954,6 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations() { AnimationMutation{tag, props["opacity"].asDouble()}); containsChange = true; } - for (auto& [tag, props] : updateViewPropsDirect_) { - mutations.emplace_back( - AnimationMutation{tag, props["opacity"].asDouble()}); - containsChange = true; - } } if (!containsChange) { @@ -984,10 +982,6 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations() { mutations.emplace_back( AnimationMutation{tag, props["opacity"].asDouble()}); } - for (auto& [tag, props] : updateViewPropsDirect_) { - mutations.emplace_back( - AnimationMutation{tag, props["opacity"].asDouble()}); - } } } else { // There is no active animation. Stop the render callback. diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h index c1de0e3dc22..28904a811c2 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h @@ -63,6 +63,9 @@ class NativeAnimatedNodesManager { StartOnRenderCallback&& startOnRenderCallback = nullptr, StopOnRenderCallback&& stopOnRenderCallback = nullptr) noexcept; + explicit NativeAnimatedNodesManager( + std::shared_ptr animationBackend) noexcept; + ~NativeAnimatedNodesManager() noexcept; template < diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 62b38903171..55c13742fea 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace facebook::react { @@ -64,11 +65,22 @@ NativeAnimatedNodesManagerProvider::getOrCreate( uiManager->synchronouslyUpdateViewOnUIThread(viewTag, props); }; - nativeAnimatedNodesManager_ = std::make_shared( - std::move(directManipulationCallback), - std::move(fabricCommitCallback), - std::move(startOnRenderCallback_), - std::move(stopOnRenderCallback_)); + if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { + animationBackend_ = std::make_shared( + std::move(startOnRenderCallback_), + std::move(stopOnRenderCallback_), + std::move(directManipulationCallback)); + + nativeAnimatedNodesManager_ = + std::make_shared(animationBackend_); + } else { + nativeAnimatedNodesManager_ = + std::make_shared( + std::move(directManipulationCallback), + std::move(fabricCommitCallback), + std::move(startOnRenderCallback_), + std::move(stopOnRenderCallback_)); + } addEventEmitterListener( nativeAnimatedNodesManager_->getEventEmitterListener()); diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h index 7643825f981..bec77feac8e 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h @@ -46,6 +46,7 @@ class NativeAnimatedNodesManagerProvider { std::shared_ptr getEventEmitterListener(); private: + std::shared_ptr animationBackend_; std::shared_ptr nativeAnimatedNodesManager_; std::shared_ptr eventEmitterListenerContainer_; diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp index a68036d0e05..0265a41df35 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp @@ -10,12 +10,12 @@ namespace facebook::react { AnimationBackend::AnimationBackend( - const StartOnRenderCallback& startOnRenderCallback, - const StopOnRenderCallback& stopOnRenderCallback, - const DirectManipulationCallback& directManipulationCallback) - : startOnRenderCallback_(startOnRenderCallback), - stopOnRenderCallback_(stopOnRenderCallback), - directManipulationCallback_(directManipulationCallback) {} + StartOnRenderCallback&& startOnRenderCallback, + StopOnRenderCallback&& stopOnRenderCallback, + DirectManipulationCallback&& directManipulationCallback) + : startOnRenderCallback_(std::move(startOnRenderCallback)), + stopOnRenderCallback_(std::move(stopOnRenderCallback)), + directManipulationCallback_(std::move(directManipulationCallback)) {} void AnimationBackend::onAnimationFrame(double timestamp) { for (auto& callback : callbacks) { diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h index 41ab028355b..61b11e459d0 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.h @@ -29,14 +29,14 @@ using DirectManipulationCallback = class AnimationBackend { public: std::vector callbacks; - const StartOnRenderCallback& startOnRenderCallback_; - const StopOnRenderCallback& stopOnRenderCallback_; - const DirectManipulationCallback& directManipulationCallback_; + const StartOnRenderCallback startOnRenderCallback_; + const StopOnRenderCallback stopOnRenderCallback_; + const DirectManipulationCallback directManipulationCallback_; AnimationBackend( - const StartOnRenderCallback& startOnRenderCallback, - const StopOnRenderCallback& stopOnRenderCallback, - const DirectManipulationCallback& directManipulationCallback); + StartOnRenderCallback&& startOnRenderCallback, + StopOnRenderCallback&& stopOnRenderCallback, + DirectManipulationCallback&& directManipulationCallback); void onAnimationFrame(double timestamp); void start(const Callback& callback); void stop();