Fixed
Status Update
Comments
ap...@google.com <ap...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 1102527720dfd1d2de0e11e0d769439a3700fb58
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Wed Nov 18 19:23:35 2020
Introduce placeable.placeWithLayer
We decided to integrate functionality currently available as DrawLayerModifier right inside the Layout system.
Why to do so:
1) To allow custom layouts to insert the layers for the children if they need to. For example It is needed in LazyColumn as an optimization ( b/170296989 )
2) Allows to simplify the system by having less concepts. Now DrawLayerModifier is a whole separate concept. With integrating layers right inside the layout system Modifier.drawLayer() will be implemented just as a simple LayoutModifier with DrawLayerModifier class being removed. We already did the same thing with ZIndexModifier ( b/171493718 )
Relnote: New methods placeable.placeWithLayer() and placeable.placeRelativeWithLayer() were added which allows custom layouts and layout modifiers to place a child with introducing a graphics layer for their drawing. Having that we can first optimize redrawings, so when we need to move a child we don't have to redraw its content, second we can apply draw transformations for a child
Bug: 173030831
Test: New tests, existing tests are passing
Change-Id: Ibd8f6bb03f391c3f1bbf13f659d79e3b57019a46
M compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/BoundsTest.kt
M compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/ModifierInfoTest.kt
M compose/ui/ui/api/current.txt
M compose/ui/ui/api/public_plus_experimental_current.txt
M compose/ui/ui/api/restricted_current.txt
M compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/DrawLayerModifier.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasureBlocks.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingLayoutNodeWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerPlaceable.kt
D compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayerWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedDrawNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedLayoutNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OuterMeasurablePlaceable.kt
M compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt
M compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
https://android-review.googlesource.com/1503751
Branch: androidx-master-dev
commit 1102527720dfd1d2de0e11e0d769439a3700fb58
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Wed Nov 18 19:23:35 2020
Introduce placeable.placeWithLayer
We decided to integrate functionality currently available as DrawLayerModifier right inside the Layout system.
Why to do so:
1) To allow custom layouts to insert the layers for the children if they need to. For example It is needed in LazyColumn as an optimization (
2) Allows to simplify the system by having less concepts. Now DrawLayerModifier is a whole separate concept. With integrating layers right inside the layout system Modifier.drawLayer() will be implemented just as a simple LayoutModifier with DrawLayerModifier class being removed. We already did the same thing with ZIndexModifier (
Relnote: New methods placeable.placeWithLayer() and placeable.placeRelativeWithLayer() were added which allows custom layouts and layout modifiers to place a child with introducing a graphics layer for their drawing. Having that we can first optimize redrawings, so when we need to move a child we don't have to redraw its content, second we can apply draw transformations for a child
Bug: 173030831
Test: New tests, existing tests are passing
Change-Id: Ibd8f6bb03f391c3f1bbf13f659d79e3b57019a46
M compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/BoundsTest.kt
M compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/ModifierInfoTest.kt
M compose/ui/ui/api/current.txt
M compose/ui/ui/api/public_plus_experimental_current.txt
M compose/ui/ui/api/restricted_current.txt
M compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/DrawLayerModifier.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Layout.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/Placeable.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RootMeasureBlocks.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingLayoutNodeWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/InnerPlaceable.kt
D compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayerWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedDrawNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedLayoutNode.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OuterMeasurablePlaceable.kt
M compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt
M compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
ap...@google.com <ap...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 6db0f4e9c3de0d0d756cc7e4992613b15f248a51
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Fri Nov 20 15:12:06 2020
Automatically insert graphics layers for items of LazyColumn/Row
Depending on the item content it can improve the drawing performance up to 70% percent when we scroll without composing the new elements as instead of redrawing the items content on every scroll offset we just move the associated RenderNodes.
Fixes: 170296989
Test: new tests to verify items are not redrawn
Change-Id: I8eaddbae2cf8548c3b972cddb46f537a3989e0cd
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnForTest.kt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowForTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
M compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
https://android-review.googlesource.com/1507498
Branch: androidx-master-dev
commit 6db0f4e9c3de0d0d756cc7e4992613b15f248a51
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Fri Nov 20 15:12:06 2020
Automatically insert graphics layers for items of LazyColumn/Row
Depending on the item content it can improve the drawing performance up to 70% percent when we scroll without composing the new elements as instead of redrawing the items content on every scroll offset we just move the associated RenderNodes.
Fixes: 170296989
Test: new tests to verify items are not redrawn
Change-Id: I8eaddbae2cf8548c3b972cddb46f537a3989e0cd
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnForTest.kt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowForTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
M compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
Description
LazyColumnFor(items) {
Text("$it", Modifier.background(Color.Red))
}
We scroll such list few pixels(no new items composed as a result)
Draw performance is: 124397 ns
Now we add a layer
LazyColumnFor(items) {
Text("$it", Modifier.drawLayer().background(Color.Red))
}
Draw performance is: 63371 ns (50% less)
Use case 2
LazyColumnFor(items) {
var color by remember { mutableStateOf(Color.Red) }
Text("$it", Modifier.clickable(indication = null) {
color = Color.Green
}.drawBehind {
drawRect(color)
})
}
Invalidating only one item:
Without layers on each item: 1137259 ns
With layers: 113771 ns (90% less).
We should have a way for a layouts to insert layers for children