Promote grandchildren of certain views are Views
Summary: As an optimization, for something like a ScrollView which contains a FlatViewGroup containing posts, make sure that each post is explicitly mounted to a View. This may help improve performance, especially when said Views are otherwise inlined as DrawCommands instead of actual Views. Reviewed By: astreet Differential Revision: D3161232
This commit is contained in:
parent
0adc390a19
commit
4bb33f93cd
|
@ -11,6 +11,7 @@ package com.facebook.react.flat;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.facebook.csslayout.CSSNode;
|
||||||
import com.facebook.infer.annotation.Assertions;
|
import com.facebook.infer.annotation.Assertions;
|
||||||
import com.facebook.react.uimanager.LayoutShadowNode;
|
import com.facebook.react.uimanager.LayoutShadowNode;
|
||||||
import com.facebook.react.uimanager.OnLayoutEvent;
|
import com.facebook.react.uimanager.OnLayoutEvent;
|
||||||
|
@ -55,6 +56,7 @@ import com.facebook.react.views.view.ReactClippingViewGroupHelper;
|
||||||
private @Nullable DrawBackgroundColor mDrawBackground;
|
private @Nullable DrawBackgroundColor mDrawBackground;
|
||||||
private boolean mClipToBounds = false;
|
private boolean mClipToBounds = false;
|
||||||
private boolean mIsUpdated = true;
|
private boolean mIsUpdated = true;
|
||||||
|
private boolean mForceMountChildrenToView;
|
||||||
private float mClipLeft;
|
private float mClipLeft;
|
||||||
private float mClipTop;
|
private float mClipTop;
|
||||||
private float mClipRight;
|
private float mClipRight;
|
||||||
|
@ -89,6 +91,20 @@ import com.facebook.react.views.view.ReactClippingViewGroupHelper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* package */ final void forceMountChildrenToView() {
|
||||||
|
if (mForceMountChildrenToView) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mForceMountChildrenToView = true;
|
||||||
|
for (int i = 0, childCount = getChildCount(); i != childCount; ++i) {
|
||||||
|
ReactShadowNode child = getChildAt(i);
|
||||||
|
if (child instanceof FlatShadowNode) {
|
||||||
|
((FlatShadowNode) child).forceMountToView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collects DrawCommands produced by this FlatShadowNode.
|
* Collects DrawCommands produced by this FlatShadowNode.
|
||||||
*/
|
*/
|
||||||
|
@ -157,6 +173,14 @@ import com.facebook.react.views.view.ReactClippingViewGroupHelper;
|
||||||
return mViewBottom - mViewTop;
|
return mViewBottom - mViewTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addChildAt(CSSNode child, int i) {
|
||||||
|
super.addChildAt(child, i);
|
||||||
|
if (mForceMountChildrenToView && child instanceof FlatShadowNode) {
|
||||||
|
((FlatShadowNode) child).forceMountToView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks root node as updated to trigger a StateBuilder pass to collect DrawCommands for the node
|
* Marks root node as updated to trigger a StateBuilder pass to collect DrawCommands for the node
|
||||||
* tree. Use it when FlatShadowNode is updated but doesn't require a layout pass (e.g. background
|
* tree. Use it when FlatShadowNode is updated but doesn't require a layout pass (e.g. background
|
||||||
|
|
|
@ -23,6 +23,7 @@ import com.facebook.react.uimanager.ViewManager;
|
||||||
@Nullable private final ReactShadowNode mReactShadowNode;
|
@Nullable private final ReactShadowNode mReactShadowNode;
|
||||||
private final boolean mNeedsCustomLayoutForChildren;
|
private final boolean mNeedsCustomLayoutForChildren;
|
||||||
private boolean mPaddingChanged = false;
|
private boolean mPaddingChanged = false;
|
||||||
|
private boolean mForceMountGrandChildrenToView;
|
||||||
|
|
||||||
/* package */ NativeViewWrapper(ViewManager viewManager) {
|
/* package */ NativeViewWrapper(ViewManager viewManager) {
|
||||||
ReactShadowNode reactShadowNode = viewManager.createShadowNodeInstance();
|
ReactShadowNode reactShadowNode = viewManager.createShadowNodeInstance();
|
||||||
|
@ -36,11 +37,13 @@ import com.facebook.react.uimanager.ViewManager;
|
||||||
if (viewManager instanceof ViewGroupManager) {
|
if (viewManager instanceof ViewGroupManager) {
|
||||||
ViewGroupManager viewGroupManager = (ViewGroupManager) viewManager;
|
ViewGroupManager viewGroupManager = (ViewGroupManager) viewManager;
|
||||||
mNeedsCustomLayoutForChildren = viewGroupManager.needsCustomLayoutForChildren();
|
mNeedsCustomLayoutForChildren = viewGroupManager.needsCustomLayoutForChildren();
|
||||||
|
mForceMountGrandChildrenToView = viewGroupManager.shouldPromoteGrandchildren();
|
||||||
} else {
|
} else {
|
||||||
mNeedsCustomLayoutForChildren = false;
|
mNeedsCustomLayoutForChildren = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
forceMountToView();
|
forceMountToView();
|
||||||
|
forceMountChildrenToView();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -82,8 +85,8 @@ import com.facebook.react.uimanager.ViewManager;
|
||||||
@Override
|
@Override
|
||||||
public void addChildAt(CSSNode child, int i) {
|
public void addChildAt(CSSNode child, int i) {
|
||||||
super.addChildAt(child, i);
|
super.addChildAt(child, i);
|
||||||
if (child instanceof FlatShadowNode) {
|
if (mForceMountGrandChildrenToView && child instanceof FlatShadowNode) {
|
||||||
((FlatShadowNode) child).forceMountToView();
|
((FlatShadowNode) child).forceMountChildrenToView();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue