From 896be2ffb9d63d71ec8c8af9ce32268d03ab6e6e Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 5 Aug 2026 18:29:47 +0200 Subject: [PATCH 1/2] perf: Skip lifecycle processing work when the queue is empty --- .../components/core/component_tree_root.dart | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/flame/lib/src/components/core/component_tree_root.dart b/packages/flame/lib/src/components/core/component_tree_root.dart index f5b0b44e913..a341d6f715c 100644 --- a/packages/flame/lib/src/components/core/component_tree_root.dart +++ b/packages/flame/lib/src/components/core/component_tree_root.dart @@ -137,10 +137,16 @@ class ComponentTreeRoot extends Component { } void processLifecycleEvents() { + if (!hasLifecycleEvents) { + // The completer is only ever created while events are queued, so there + // is nothing to complete here either. + assert(_lifecycleEventsCompleter == null); + return; + } // reorder events to process later grouped by parent - final reorderParents = {}; + Set? reorderParents; LifecycleEventStatus handleReorderEvent(Component parent) { - reorderParents.add(parent); + (reorderParents ??= {}).add(parent); return LifecycleEventStatus.done; } @@ -151,7 +157,8 @@ class ComponentTreeRoot extends Component { for (final event in queue) { final child = event.child!; final parent = event.parent!; - if (_blocked.contains(child) || _blocked.contains(parent)) { + if (_blocked.isNotEmpty && + (_blocked.contains(child) || _blocked.contains(parent))) { continue; } @@ -176,8 +183,10 @@ class ComponentTreeRoot extends Component { _blocked.clear(); } - for (final parent in reorderParents) { - parent.rebalanceChildren(); + if (reorderParents != null) { + for (final parent in reorderParents!) { + parent.rebalanceChildren(); + } } if (!hasLifecycleEvents && _lifecycleEventsCompleter != null) { From 08b39106bc594a281f82049e26fe7d368be05e0f Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 5 Aug 2026 22:16:10 +0200 Subject: [PATCH 2/2] refactor: Address review feedback on the empty-queue early-out --- .../src/components/core/component_tree_root.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flame/lib/src/components/core/component_tree_root.dart b/packages/flame/lib/src/components/core/component_tree_root.dart index a341d6f715c..2d5f1c33380 100644 --- a/packages/flame/lib/src/components/core/component_tree_root.dart +++ b/packages/flame/lib/src/components/core/component_tree_root.dart @@ -138,9 +138,11 @@ class ComponentTreeRoot extends Component { void processLifecycleEvents() { if (!hasLifecycleEvents) { - // The completer is only ever created while events are queued, so there - // is nothing to complete here either. - assert(_lifecycleEventsCompleter == null); + assert( + _lifecycleEventsCompleter == null, + 'The completer is only ever created while events are queued, so it ' + 'should never exist while the queue is empty', + ); return; } // reorder events to process later grouped by parent @@ -183,10 +185,8 @@ class ComponentTreeRoot extends Component { _blocked.clear(); } - if (reorderParents != null) { - for (final parent in reorderParents!) { - parent.rebalanceChildren(); - } + for (final parent in reorderParents ?? const {}) { + parent.rebalanceChildren(); } if (!hasLifecycleEvents && _lifecycleEventsCompleter != null) {