mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Use RuntimeScheduler in EventBeat (#47146)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/47146 This will allows us to batch sync events which leads to better performance. Changelog: [Internal] Reviewed By: yungsters Differential Revision: D64631346 fbshipit-source-id: b82dca150c13bdb7acae6bedb392a93993273988
This commit is contained in:
committed by
Facebook GitHub Bot
parent
6098f24dfc
commit
22b60c576b
@@ -14,8 +14,8 @@ namespace facebook::react {
|
||||
AppleEventBeat::AppleEventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
std::unique_ptr<const RunLoopObserver> uiRunLoopObserver,
|
||||
RuntimeExecutor runtimeExecutor)
|
||||
: EventBeat(std::move(ownerBox), std::move(runtimeExecutor)),
|
||||
RuntimeScheduler& runtimeScheduler)
|
||||
: EventBeat(std::move(ownerBox), runtimeScheduler),
|
||||
uiRunLoopObserver_(std::move(uiRunLoopObserver)) {
|
||||
uiRunLoopObserver_->setDelegate(this);
|
||||
uiRunLoopObserver_->enable();
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
class RuntimeScheduler;
|
||||
|
||||
/*
|
||||
* Event beat associated with JavaScript runtime.
|
||||
* The beat is called on `RuntimeExecutor`'s thread induced by the UI thread
|
||||
@@ -23,7 +25,7 @@ class AppleEventBeat : public EventBeat, public RunLoopObserver::Delegate {
|
||||
AppleEventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
std::unique_ptr<const RunLoopObserver> uiRunLoopObserver,
|
||||
RuntimeExecutor runtimeExecutor);
|
||||
RuntimeScheduler& RuntimeScheduler);
|
||||
|
||||
#pragma mark - RunLoopObserver::Delegate
|
||||
|
||||
|
||||
@@ -258,10 +258,10 @@ using namespace facebook::react;
|
||||
toolbox.bridgelessBindingsExecutor = _bridgelessBindingsExecutor;
|
||||
|
||||
toolbox.eventBeatFactory =
|
||||
[runtimeExecutor](std::shared_ptr<EventBeat::OwnerBox> ownerBox) -> std::unique_ptr<EventBeat> {
|
||||
[runtimeScheduler](std::shared_ptr<EventBeat::OwnerBox> ownerBox) -> std::unique_ptr<EventBeat> {
|
||||
auto runLoopObserver =
|
||||
std::make_unique<const MainRunLoopObserver>(RunLoopObserver::Activity::BeforeWaiting, ownerBox->owner);
|
||||
return std::make_unique<AppleEventBeat>(std::move(ownerBox), std::move(runLoopObserver), runtimeExecutor);
|
||||
return std::make_unique<AppleEventBeat>(std::move(ownerBox), std::move(runLoopObserver), *runtimeScheduler);
|
||||
};
|
||||
|
||||
RCTScheduler *scheduler = [[RCTScheduler alloc] initWithToolbox:toolbox];
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace facebook::react {
|
||||
AndroidEventBeat::AndroidEventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
EventBeatManager* eventBeatManager,
|
||||
RuntimeExecutor runtimeExecutor,
|
||||
RuntimeScheduler& runtimeScheduler,
|
||||
jni::global_ref<jobject> javaUIManager)
|
||||
: EventBeat(std::move(ownerBox), std::move(runtimeExecutor)),
|
||||
: EventBeat(std::move(ownerBox), runtimeScheduler),
|
||||
eventBeatManager_(eventBeatManager),
|
||||
javaUIManager_(std::move(javaUIManager)) {
|
||||
eventBeatManager->addObserver(*this);
|
||||
|
||||
@@ -19,7 +19,7 @@ class AndroidEventBeat final : public EventBeat,
|
||||
AndroidEventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
EventBeatManager* eventBeatManager,
|
||||
RuntimeExecutor runtimeExecutor,
|
||||
RuntimeScheduler& runtimeScheduler,
|
||||
jni::global_ref<jobject> javaUIManager);
|
||||
|
||||
~AndroidEventBeat() override;
|
||||
|
||||
+11
-14
@@ -471,28 +471,25 @@ void FabricUIManagerBinding::installFabricUIManager(
|
||||
|
||||
auto runtimeExecutor = runtimeExecutorHolder->cthis()->get();
|
||||
|
||||
if (runtimeSchedulerHolder) {
|
||||
auto runtimeScheduler = runtimeSchedulerHolder->cthis()->get().lock();
|
||||
if (runtimeScheduler) {
|
||||
runtimeExecutor =
|
||||
[runtimeScheduler](
|
||||
std::function<void(jsi::Runtime & runtime)>&& callback) {
|
||||
runtimeScheduler->scheduleWork(std::move(callback));
|
||||
};
|
||||
contextContainer->insert(
|
||||
"RuntimeScheduler",
|
||||
std::weak_ptr<RuntimeScheduler>(runtimeScheduler));
|
||||
}
|
||||
auto runtimeScheduler = runtimeSchedulerHolder->cthis()->get().lock();
|
||||
if (runtimeScheduler) {
|
||||
runtimeExecutor =
|
||||
[runtimeScheduler](
|
||||
std::function<void(jsi::Runtime & runtime)>&& callback) {
|
||||
runtimeScheduler->scheduleWork(std::move(callback));
|
||||
};
|
||||
contextContainer->insert(
|
||||
"RuntimeScheduler", std::weak_ptr<RuntimeScheduler>(runtimeScheduler));
|
||||
}
|
||||
|
||||
EventBeat::Factory eventBeatFactory =
|
||||
[eventBeatManager, runtimeExecutor, globalJavaUiManager](
|
||||
[eventBeatManager, &runtimeScheduler, globalJavaUiManager](
|
||||
std::shared_ptr<EventBeat::OwnerBox> ownerBox)
|
||||
-> std::unique_ptr<EventBeat> {
|
||||
return std::make_unique<AndroidEventBeat>(
|
||||
std::move(ownerBox),
|
||||
eventBeatManager,
|
||||
runtimeExecutor,
|
||||
*runtimeScheduler,
|
||||
globalJavaUiManager);
|
||||
};
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
|
||||
#include "EventBeat.h"
|
||||
|
||||
#include <react/renderer/runtimescheduler/RuntimeScheduler.h>
|
||||
#include <utility>
|
||||
|
||||
namespace facebook::react {
|
||||
|
||||
EventBeat::EventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
RuntimeExecutor runtimeExecutor)
|
||||
: ownerBox_(std::move(ownerBox)),
|
||||
runtimeExecutor_(std::move(runtimeExecutor)) {}
|
||||
RuntimeScheduler& runtimeScheduler)
|
||||
: ownerBox_(std::move(ownerBox)), runtimeScheduler_(runtimeScheduler) {}
|
||||
|
||||
void EventBeat::request() const {
|
||||
isRequested_ = true;
|
||||
@@ -33,17 +33,18 @@ void EventBeat::induce() const {
|
||||
isRequested_ = false;
|
||||
isBeatCallbackScheduled_ = true;
|
||||
|
||||
runtimeExecutor_([this, ownerBox = ownerBox_](jsi::Runtime& runtime) {
|
||||
auto owner = ownerBox->owner.lock();
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
runtimeScheduler_.scheduleWork(
|
||||
[this, ownerBox = ownerBox_](jsi::Runtime& runtime) {
|
||||
auto owner = ownerBox->owner.lock();
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
isBeatCallbackScheduled_ = false;
|
||||
if (beatCallback_) {
|
||||
beatCallback_(runtime);
|
||||
}
|
||||
});
|
||||
isBeatCallbackScheduled_ = false;
|
||||
if (beatCallback_) {
|
||||
beatCallback_(runtime);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
@@ -7,11 +7,14 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <ReactCommon/RuntimeExecutor.h>
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
|
||||
namespace facebook::react {
|
||||
class RuntimeScheduler;
|
||||
}
|
||||
|
||||
namespace facebook::jsi {
|
||||
class Runtime;
|
||||
}
|
||||
@@ -56,7 +59,7 @@ class EventBeat {
|
||||
|
||||
explicit EventBeat(
|
||||
std::shared_ptr<OwnerBox> ownerBox,
|
||||
RuntimeExecutor runtimeExecutor);
|
||||
RuntimeScheduler& runtimeScheduler);
|
||||
|
||||
virtual ~EventBeat() = default;
|
||||
|
||||
@@ -88,7 +91,7 @@ class EventBeat {
|
||||
mutable std::atomic<bool> isRequested_{false};
|
||||
|
||||
private:
|
||||
RuntimeExecutor runtimeExecutor_;
|
||||
RuntimeScheduler& runtimeScheduler_;
|
||||
mutable std::atomic<bool> isBeatCallbackScheduled_{false};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user