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:
Joshua Gross
2019-02-27 12:38:07 -08:00
committed by Facebook Github Bot
parent d4ce8463a8
commit edceba9a9c
6 changed files with 37 additions and 19 deletions

View File

@@ -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:

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;
};