[Prestaties][P2] TextPainters in de meetfuncties worden nooit vrijgegeven — native geheugendruk bij veel tabellen #2632
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2632
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom
Decks en documenten met veel tabellen bouwen bij bewerken geheugendruk op, met af en toe haperingen door garbage collection.
Oorzaak
De gedeelde tekstmeting maakt per meting een
TextPainteren geeft hem nooit vrij:measureTextHeight(lib/services/text_measurement.dart:18-38) en_painterFor(regel 87-103, gebruikt doormeasureTextWidth/measureTextWordWidth) roepen geendispose()aan;chart_preview_improvement.dart(4×),cockpit_painter_support.dart(2×),code_preview.dart,scene_painter.dart.(
timeline_fit.dart,scorecard_preview.dartenchart_preview_radar.dartdoen het wél goed.)Een
TextPainterhoudt een nativeui.Paragraphvast; zonderdispose()komt dat geheugen pas vrij als de garbage collector de Dart-wrapper finaliseert. En het aantal is groot: de tabelinpassing (tableFitCellSize→tableBlockHeight,lib/services/table_layout_metrics.dart:280-363) meet elke cel bij elke stap van de lettergroottezoektocht, plus de woordbreedtes. Voor een tabel van 40×6 is dat in de orde van 1 500 paragrafen per inpassing, en dat per breedte (strook, preview, presentator, beamer) zodra de dia verandert.Gemeten (debug, Apple Silicon):
tableFitkost koud 0,7 / 2,6 / 5,0 ms voor 8 / 20 / 40 rijen per breedte. Dat is acceptabel; het punt is de native-geheugenstroom eromheen, niet de rekentijd.Voorgestelde oplossing
try { … } finally { painter.dispose(); }in alle meetfuncties die alleen een getal teruggeven.tableBlockHeightper (tekst, celgrootte, breedte) de rijhoogte memoïseren binnen ééntableFit-aanroep: tussen de zoekstappen verandert alleen de celgrootte, en veel cellen ("OK", "Hoog") zijn identiek.Toets
Flutter's leak-tracking (
leak_trackerintestWidgets) op een tabeldia-test: geen niet-vrijgegevenTextPainters.Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).