From 27a5bac5a7c01f81d9a836d2b74634f163700206 Mon Sep 17 00:00:00 2001 From: Nikolay Rykunov Date: Mon, 13 Mar 2023 12:43:53 +0100 Subject: [PATCH] Reduce temporary collections creation in updatePointerPositions --- .../androidx/compose/ui/ComposeScene.skiko.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt index 9d2018946ea56..4ec0884b90360 100644 --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt @@ -493,15 +493,20 @@ class ComposeScene internal constructor( } private fun updatePointerPositions(event: PointerInputEvent) { - // touches/styluses positions should be removed from [pointerPositions] if they are not down anymore - val releasedPointers = event.pointers.filter { it.type != PointerType.Mouse && !it.down } - for (pointer in releasedPointers) { - pointerPositions.remove(pointer.id) - } // update positions for pointers that are down + mouse - val pointersToUpdate = event.pointers - releasedPointers.toSet() - for (pointer in pointersToUpdate) { - pointerPositions[pointer.id] = pointer.position + for (pointer in event.pointers) { + if (pointer.type == PointerType.Mouse || pointer.down) { + pointerPositions[pointer.id] = pointer.position + } + } + // touches/styluses positions should be removed from [pointerPositions] if they are not down anymore + val iterator = pointerPositions.iterator() + while (iterator.hasNext()) { + val pointerId = iterator.next().key + val pointer = event.pointers.find { it.id == pointerId } ?: continue + if (pointer.type != PointerType.Mouse && !pointer.down) { + iterator.remove() + } } }