From 09a9aa480b075153e8483935f5303953fc100680 Mon Sep 17 00:00:00 2001 From: Zeya Peng Date: Thu, 11 Jun 2026 14:25:25 -0700 Subject: [PATCH] Flush unbatched createAnimatedNode under the shared AnimationBackend Summary: ## Changelog: [Internal] Reviewed By: javache Differential Revision: D108062822 --- .../animated/NativeAnimatedNodesManager.cpp | 39 +++++++++++-------- .../animated/NativeAnimatedNodesManager.h | 2 + 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp index 991ec92327a1..5eeb0ca77a4c 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp @@ -1039,6 +1039,9 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations( isOnRenderThread_ = true; + // Apply nodes created via the unbatched `createAnimatedNodeAsync` path. + flushAnimatedNodesCreatedAsync(); + // Run operations scheduled from AnimatedModule std::vector operations; { @@ -1097,6 +1100,24 @@ AnimationMutations NativeAnimatedNodesManager::pullAnimationMutations( return mutations; } +void NativeAnimatedNodesManager::flushAnimatedNodesCreatedAsync() noexcept { + // Flush async created animated nodes + std::unordered_map> + animatedNodesCreatedAsync; + { + std::lock_guard lock(animatedNodesCreatedAsyncMutex_); + std::swap(animatedNodesCreatedAsync, animatedNodesCreatedAsync_); + } + + if (!animatedNodesCreatedAsync.empty()) { + std::lock_guard lock(connectedAnimatedNodesMutex_); + for (auto& [tag, node] : animatedNodesCreatedAsync) { + animatedNodes_.insert({tag, std::move(node)}); + updatedNodeTags_.insert(tag); + } + } +} + void NativeAnimatedNodesManager::onRender() { if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { return; @@ -1112,23 +1133,7 @@ void NativeAnimatedNodesManager::onRender() { isOnRenderThread_ = true; - { - // Flush async created animated nodes - std::unordered_map> - animatedNodesCreatedAsync; - { - std::lock_guard lock(animatedNodesCreatedAsyncMutex_); - std::swap(animatedNodesCreatedAsync, animatedNodesCreatedAsync_); - } - - if (!animatedNodesCreatedAsync.empty()) { - std::lock_guard lock(connectedAnimatedNodesMutex_); - for (auto& [tag, node] : animatedNodesCreatedAsync) { - animatedNodes_.insert({tag, std::move(node)}); - updatedNodeTags_.insert(tag); - } - } - } + flushAnimatedNodesCreatedAsync(); // Run operations scheduled from AnimatedModule std::vector operations; diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h index c969eea23b1c..67a619f2552c 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h @@ -207,6 +207,8 @@ class NativeAnimatedNodesManager : public std::enable_shared_from_this