mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-05-13 12:26:45 +08:00
Slider component - cache measurements, don't create measure manager on iOS
Summary: Small perf wins for both iOS and Android. Reviewed By: PeteTheHeat Differential Revision: D14237532 fbshipit-source-id: 2be114d36adfa6e8540cb8cbca5412782791d8ce
This commit is contained in:
committed by
Facebook Github Bot
parent
d4ce8463a8
commit
edceba9a9c
@@ -36,7 +36,9 @@ class SliderComponentDescriptor final
|
||||
imageManager_(nullptr),
|
||||
#endif
|
||||
measurementsManager_(
|
||||
std::make_shared<SliderMeasurementsManager>(contextContainer)) {
|
||||
SliderMeasurementsManager::shouldMeasureSlider()
|
||||
? std::make_shared<SliderMeasurementsManager>(contextContainer)
|
||||
: nullptr) {
|
||||
}
|
||||
|
||||
void adopt(UnsharedShadowNode shadowNode) const override {
|
||||
@@ -50,13 +52,15 @@ class SliderComponentDescriptor final
|
||||
// communicate the loading state and results to mounting layer.
|
||||
sliderShadowNode->setImageManager(imageManager_);
|
||||
|
||||
// `SliderShadowNode` uses `SliderMeasurementsManager` to
|
||||
// provide measurements to Yoga.
|
||||
sliderShadowNode->setSliderMeasurementsManager(measurementsManager_);
|
||||
if (measurementsManager_) {
|
||||
// `SliderShadowNode` uses `SliderMeasurementsManager` to
|
||||
// provide measurements to Yoga.
|
||||
sliderShadowNode->setSliderMeasurementsManager(measurementsManager_);
|
||||
|
||||
// All `SliderShadowNode`s must have leaf Yoga nodes with properly
|
||||
// setup measure function.
|
||||
sliderShadowNode->enableMeasurement();
|
||||
// All `SliderShadowNode`s must have leaf Yoga nodes with properly
|
||||
// setup measure function.
|
||||
sliderShadowNode->enableMeasurement();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -93,7 +93,7 @@ ImageSource SliderShadowNode::getThumbImageSource() const {
|
||||
#pragma mark - LayoutableShadowNode
|
||||
|
||||
Size SliderShadowNode::measure(LayoutConstraints layoutConstraints) const {
|
||||
if (measurementsManager_->shouldMeasureSlider()) {
|
||||
if (SliderMeasurementsManager::shouldMeasureSlider()) {
|
||||
return measurementsManager_->measure(layoutConstraints);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,12 +16,15 @@ using namespace facebook::jni;
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
const bool SliderMeasurementsManager::shouldMeasureSlider() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
Size SliderMeasurementsManager::measure(
|
||||
LayoutConstraints layoutConstraints) const {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (hasBeenMeasured_) {
|
||||
return cachedMeasurement_;
|
||||
}
|
||||
}
|
||||
|
||||
const jni::global_ref<jobject> &fabricUIManager =
|
||||
contextContainer_->getInstance<jni::global_ref<jobject>>(
|
||||
"FabricUIManager");
|
||||
@@ -46,7 +49,7 @@ Size SliderMeasurementsManager::measure(
|
||||
|
||||
local_ref<JString> componentName = make_jstring("RCTSlider");
|
||||
|
||||
return yogaMeassureToSize(measure(
|
||||
auto measurement = yogaMeassureToSize(measure(
|
||||
fabricUIManager,
|
||||
componentName.get(),
|
||||
nullptr,
|
||||
@@ -55,6 +58,10 @@ Size SliderMeasurementsManager::measure(
|
||||
maxWidth,
|
||||
minHeight,
|
||||
maxHeight));
|
||||
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
cachedMeasurement_ = measurement;
|
||||
return measurement;
|
||||
}
|
||||
|
||||
} // namespace react
|
||||
|
||||
@@ -22,11 +22,18 @@ class SliderMeasurementsManager {
|
||||
public:
|
||||
SliderMeasurementsManager(const SharedContextContainer &contextContainer)
|
||||
: contextContainer_(contextContainer) {}
|
||||
const bool shouldMeasureSlider() const;
|
||||
|
||||
static inline bool shouldMeasureSlider() {
|
||||
return true;
|
||||
}
|
||||
|
||||
Size measure(LayoutConstraints layoutConstraints) const;
|
||||
|
||||
private:
|
||||
const SharedContextContainer contextContainer_;
|
||||
mutable std::mutex mutex_;
|
||||
mutable bool hasBeenMeasured_ = false;
|
||||
mutable Size cachedMeasurement_{};
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
|
||||
@@ -10,10 +10,6 @@
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
const bool SliderMeasurementsManager::shouldMeasureSlider() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
Size SliderMeasurementsManager::measure(
|
||||
LayoutConstraints layoutConstraints) const {
|
||||
assert(false); // should never reach this point
|
||||
|
||||
@@ -21,7 +21,11 @@ namespace react {
|
||||
class SliderMeasurementsManager {
|
||||
public:
|
||||
SliderMeasurementsManager(const SharedContextContainer &contextContainer) {}
|
||||
const bool shouldMeasureSlider() const;
|
||||
|
||||
static inline bool shouldMeasureSlider() {
|
||||
return false;
|
||||
}
|
||||
|
||||
Size measure(LayoutConstraints layoutConstraints) const;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user