Skip to content

Commit 96e3eb4

Browse files
yungstersmeta-codesync[bot]
authored andcommitted
Fling: Cleanup virtualViewHysteresisRatio
Summary: Deletes the `virtualViewHysteresisRatio` feature flag. It was never rolled out and not found to significantly improve performance. Changelog: [Internal] Differential Revision: D90337120
1 parent 6316c7a commit 96e3eb4

23 files changed

Lines changed: 48 additions & 207 deletions

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<e12e5425f1a51acfd0f244e5d4f46a3e>>
7+
* @generated SignedSource<<f65e9c6c5c404c0db2fe537917b27557>>
88
*/
99

1010
/**
@@ -516,12 +516,6 @@ public object ReactNativeFeatureFlags {
516516
@JvmStatic
517517
public fun viewCullingOutsetRatio(): Double = accessor.viewCullingOutsetRatio()
518518

519-
/**
520-
* Sets a hysteresis window for transition between prerender and hidden modes.
521-
*/
522-
@JvmStatic
523-
public fun virtualViewHysteresisRatio(): Double = accessor.virtualViewHysteresisRatio()
524-
525519
/**
526520
* Initial prerender ratio for VirtualView.
527521
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<fe103b59da0f78a6e834ca92603531fb>>
7+
* @generated SignedSource<<907fd6d60faaeb4c28ffd3b40928347e>>
88
*/
99

1010
/**
@@ -101,7 +101,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
101101
private var useTurboModuleInteropCache: Boolean? = null
102102
private var useTurboModulesCache: Boolean? = null
103103
private var viewCullingOutsetRatioCache: Double? = null
104-
private var virtualViewHysteresisRatioCache: Double? = null
105104
private var virtualViewPrerenderRatioCache: Double? = null
106105

107106
override fun commonTestFlag(): Boolean {
@@ -833,15 +832,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
833832
return cached
834833
}
835834

836-
override fun virtualViewHysteresisRatio(): Double {
837-
var cached = virtualViewHysteresisRatioCache
838-
if (cached == null) {
839-
cached = ReactNativeFeatureFlagsCxxInterop.virtualViewHysteresisRatio()
840-
virtualViewHysteresisRatioCache = cached
841-
}
842-
return cached
843-
}
844-
845835
override fun virtualViewPrerenderRatio(): Double {
846836
var cached = virtualViewPrerenderRatioCache
847837
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<0ae5a806950b4bfaaaccde774114ab4e>>
7+
* @generated SignedSource<<497416e09c55455dccb439c15955ee00>>
88
*/
99

1010
/**
@@ -190,8 +190,6 @@ public object ReactNativeFeatureFlagsCxxInterop {
190190

191191
@DoNotStrip @JvmStatic public external fun viewCullingOutsetRatio(): Double
192192

193-
@DoNotStrip @JvmStatic public external fun virtualViewHysteresisRatio(): Double
194-
195193
@DoNotStrip @JvmStatic public external fun virtualViewPrerenderRatio(): Double
196194

197195
@DoNotStrip @JvmStatic public external fun override(provider: Any)

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<532504ff7b4a7f4c45649fc59ecade3a>>
7+
* @generated SignedSource<<26eb9af61fedaacaadc23a8698ff6117>>
88
*/
99

1010
/**
@@ -185,7 +185,5 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
185185

186186
override fun viewCullingOutsetRatio(): Double = 0.0
187187

188-
override fun virtualViewHysteresisRatio(): Double = 0.0
189-
190188
override fun virtualViewPrerenderRatio(): Double = 5.0
191189
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<d4caae6713b5c26f17841839903ea529>>
7+
* @generated SignedSource<<a1aced60121b0dc49c55b2141a331cf2>>
88
*/
99

1010
/**
@@ -105,7 +105,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
105105
private var useTurboModuleInteropCache: Boolean? = null
106106
private var useTurboModulesCache: Boolean? = null
107107
private var viewCullingOutsetRatioCache: Double? = null
108-
private var virtualViewHysteresisRatioCache: Double? = null
109108
private var virtualViewPrerenderRatioCache: Double? = null
110109

111110
override fun commonTestFlag(): Boolean {
@@ -918,16 +917,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
918917
return cached
919918
}
920919

921-
override fun virtualViewHysteresisRatio(): Double {
922-
var cached = virtualViewHysteresisRatioCache
923-
if (cached == null) {
924-
cached = currentProvider.virtualViewHysteresisRatio()
925-
accessedFeatureFlags.add("virtualViewHysteresisRatio")
926-
virtualViewHysteresisRatioCache = cached
927-
}
928-
return cached
929-
}
930-
931920
override fun virtualViewPrerenderRatio(): Double {
932921
var cached = virtualViewPrerenderRatioCache
933922
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<351ae3b05fae543b52eaa7bcf7f5f479>>
7+
* @generated SignedSource<<d6f937b2829cc1f0e49a136aae1044e9>>
88
*/
99

1010
/**
@@ -185,7 +185,5 @@ public interface ReactNativeFeatureFlagsProvider {
185185

186186
@DoNotStrip public fun viewCullingOutsetRatio(): Double
187187

188-
@DoNotStrip public fun virtualViewHysteresisRatio(): Double
189-
190188
@DoNotStrip public fun virtualViewPrerenderRatio(): Double
191189
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainer.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,10 @@ internal fun rectsOverlap(rect1: Rect, rect2: Rect): Boolean {
4747

4848
internal abstract class VirtualViewContainerState {
4949
protected val prerenderRatio: Double = ReactNativeFeatureFlags.virtualViewPrerenderRatio()
50-
protected val hysteresisRatio: Double = ReactNativeFeatureFlags.virtualViewHysteresisRatio()
5150
protected abstract val virtualViews: MutableCollection<VirtualView>
5251
protected val emptyRect: Rect = Rect()
5352
protected val visibleRect: Rect = Rect()
5453
protected val prerenderRect: Rect = Rect()
55-
protected val hysteresisRect: Rect = Rect()
5654
protected val scrollView: ViewGroup
5755

5856
companion object {
@@ -92,10 +90,7 @@ internal abstract class VirtualViewContainerState {
9290
updateModes()
9391
}
9492

95-
/**
96-
* Refreshes the coordinates for the Rects this class cares about (visibleRect, prerenderRect,
97-
* hysteresisRect)
98-
*/
93+
/** Refreshes the coordinates for the Rects this class cares about (visibleRect, prerenderRect) */
9994
protected fun updateRects() {
10095
scrollView.getDrawingRect(visibleRect)
10196

@@ -107,7 +102,6 @@ internal abstract class VirtualViewContainerState {
107102
// should set the other rects here in case scrollview is suddenly empty after the other rects
108103
// are non-empty
109104
prerenderRect.set(visibleRect)
110-
hysteresisRect.set(prerenderRect)
111105
return
112106
}
113107

@@ -117,17 +111,9 @@ internal abstract class VirtualViewContainerState {
117111
(-prerenderRect.height() * prerenderRatio).toInt(),
118112
)
119113

120-
hysteresisRect.set(prerenderRect)
121-
hysteresisRect.inset(
122-
(-visibleRect.width() * hysteresisRatio).toInt(),
123-
(-visibleRect.height() * hysteresisRatio).toInt(),
124-
)
125-
126114
debugLog(
127115
"updateRects",
128-
{
129-
"visibleRect ${visibleRect.toString()} prerenderRect ${prerenderRect.toString()} hysteresisRect ${hysteresisRect.toString()}"
130-
},
116+
{ "visibleRect ${visibleRect.toString()} prerenderRect ${prerenderRect.toString()}" },
131117
)
132118
}
133119

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateClassic.kt

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,12 @@ internal class VirtualViewContainerStateClassic(scrollView: ViewGroup) :
3333
(-prerenderRect.height() * prerenderRatio).toInt(),
3434
)
3535

36-
if (hysteresisRatio > 0.0) {
37-
hysteresisRect.set(prerenderRect)
38-
hysteresisRect.inset(
39-
(-visibleRect.width() * hysteresisRatio).toInt(),
40-
(-visibleRect.height() * hysteresisRatio).toInt(),
41-
)
42-
}
43-
4436
val virtualViewsIt =
4537
if (virtualView != null) listOf(virtualView) else virtualViews.toMutableSet()
4638
virtualViewsIt.forEach { vv ->
4739
val rect = vv.containerRelativeRect
4840

49-
var mode: VirtualViewMode? = VirtualViewMode.Hidden
41+
var mode: VirtualViewMode = VirtualViewMode.Hidden
5042
var thresholdRect = emptyRect
5143
when {
5244
rectsOverlap(rect, visibleRect) -> {
@@ -57,20 +49,13 @@ internal class VirtualViewContainerStateClassic(scrollView: ViewGroup) :
5749
mode = VirtualViewMode.Prerender
5850
thresholdRect = prerenderRect
5951
}
60-
(hysteresisRatio > 0.0 && rectsOverlap(rect, hysteresisRect)) -> {
61-
mode = null
62-
}
6352
}
6453

65-
if (mode != null) {
66-
vv.onModeChange(mode, thresholdRect)
67-
debugLog(
68-
"updateModes",
69-
{
70-
"virtualView=${vv.virtualViewID} mode=$mode rect=$rect thresholdRect=$thresholdRect"
71-
},
72-
)
73-
}
54+
vv.onModeChange(mode, thresholdRect)
55+
debugLog(
56+
"updateModes",
57+
{ "virtualView=${vv.virtualViewID} mode=$mode rect=$rect thresholdRect=$thresholdRect" },
58+
)
7459
}
7560
}
7661
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
2424
}
2525
override val virtualViews = IntervalTree(horizontal)
2626

27-
// set of all VirtualViews that are in hysteresis, prerender, or visible range
28-
var HPV: MutableSet<String> = mutableSetOf()
27+
// set of all VirtualViews that are in prerender or visible ranges
28+
var PV: MutableSet<String> = mutableSetOf()
2929
// set of all VirtualViews that are in prerender (not in viewport)
3030
var P: MutableSet<String> = mutableSetOf()
3131
// set of all VirtualViews that are in viewport
@@ -51,7 +51,7 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
5151

5252
override fun remove(virtualView: VirtualView) {
5353
super.remove(virtualView)
54-
HPV.remove(virtualView.virtualViewID)
54+
PV.remove(virtualView.virtualViewID)
5555
P.remove(virtualView.virtualViewID)
5656
V.remove(virtualView.virtualViewID)
5757
}
@@ -63,7 +63,7 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
6363
private fun updateMode(virtualView: VirtualView) {
6464
val rect = virtualView.containerRelativeRect
6565

66-
var mode: VirtualViewMode? = VirtualViewMode.Hidden
66+
var mode: VirtualViewMode = VirtualViewMode.Hidden
6767
var thresholdRect = emptyRect
6868
when {
6969
rectsOverlap(rect, visibleRect) -> {
@@ -74,38 +74,27 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
7474
mode = VirtualViewMode.Prerender
7575
thresholdRect = prerenderRect
7676
}
77-
(hysteresisRatio > 0.0 && rectsOverlap(rect, hysteresisRect)) -> {
78-
mode = null
79-
}
8077
}
8178

82-
if (mode != null) {
83-
virtualView.onModeChange(mode, thresholdRect)
84-
}
79+
virtualView.onModeChange(mode, thresholdRect)
8580

8681
// move the virtualView into the correct set(s)
87-
when {
88-
mode == VirtualViewMode.Visible -> {
89-
HPV.add(virtualView.virtualViewID)
82+
when (mode) {
83+
VirtualViewMode.Visible -> {
84+
PV.add(virtualView.virtualViewID)
9085
P.remove(virtualView.virtualViewID)
9186
V.add(virtualView.virtualViewID)
9287
}
9388

94-
mode == VirtualViewMode.Prerender -> {
95-
HPV.add(virtualView.virtualViewID)
89+
VirtualViewMode.Prerender -> {
90+
PV.add(virtualView.virtualViewID)
9691
P.add(virtualView.virtualViewID)
9792
V.remove(virtualView.virtualViewID)
9893
}
9994

100-
mode == VirtualViewMode.Hidden -> {
95+
VirtualViewMode.Hidden -> {
10196
// remove from all sets
102-
HPV.remove(virtualView.virtualViewID)
103-
P.remove(virtualView.virtualViewID)
104-
V.remove(virtualView.virtualViewID)
105-
}
106-
107-
else -> { // hysteresis
108-
HPV.add(virtualView.virtualViewID)
97+
PV.remove(virtualView.virtualViewID)
10998
P.remove(virtualView.virtualViewID)
11099
V.remove(virtualView.virtualViewID)
111100
}
@@ -117,27 +106,25 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
117106
* n), where m = size of the prerender window in terms of index
118107
*/
119108
private fun updateModesAll() {
120-
// collect V', PV', HPV' sets
109+
// collect V' and PV' sets
121110
val VPrime = virtualViews.query(visibleRect)
122111
val PVPrime = virtualViews.query(prerenderRect)
123-
val HPVPrime = virtualViews.query(hysteresisRect)
124112

125-
debugLog("updateModes", { "V: ${V}, P: ${P}, HPV: ${HPV}" })
113+
debugLog("updateModes", { "V: ${V}, P: ${P}, PV: ${PV}" })
126114

127115
/** Perform utility set differences: */
128116
// P'=PV'-V'
129117
val PPrime = PVPrime.minus(VPrime)
130118

131-
debugLog("updateModes", { "V': ${VPrime}, P': ${PPrime}, HPV': ${HPVPrime}" })
119+
debugLog("updateModes", { "V': ${VPrime}, P': ${PPrime}, PV': ${PVPrime}" })
132120

133121
/** Get useful set differences */
134122
// V'-V - update to visible
135123
val toVisible = VPrime.minus(V)
136124
// P'-P - update to prerender
137125
val toPrerender = PPrime.minus(P)
138-
// ignore H' - we don't care about VVs in hysteresis
139-
// HPV-HPV' - update to hidden
140-
val toHidden = HPV.minus(HPVPrime)
126+
// PV-PV' - update to hidden
127+
val toHidden = PV.minus(PVPrime)
141128

142129
debugLog("updateModes", { "toV: ${toVisible}, toP: ${toPrerender}, toH: ${toHidden}" })
143130

@@ -152,10 +139,10 @@ internal class VirtualViewContainerStateExperimental(scrollView: ViewGroup) :
152139
virtualViews.getVirtualView(vvID)?.onModeChange(VirtualViewMode.Hidden, emptyRect)
153140
}
154141

155-
/** update old sets - V, P, and HPV */
142+
/** update old sets - V, P, and PV */
156143
V = VPrime
157144
P = PPrime.toMutableSet()
158-
HPV = HPVPrime.toMutableSet()
145+
PV = PVPrime.toMutableSet()
159146
}
160147
}
161148

0 commit comments

Comments
 (0)