[Prestaties][P0] Gezichtsdetectie blokkeert de UI-thread per foto (standaard aan) en start bij typen opnieuw #2619
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#2619
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
Een presentatie met veel foto's openen of erin typen laat de app haperen of seconden lang "vastlopen". Het is de standaardinstelling, dus iedereen met een fotorijk deck heeft er last van.
Oorzaak
De gezichtsdetectie van de privacycontrole (
imagePrivacyRawIssuesProvider) staat standaard aan (privacyChecksEnabledenprivacyImageFaceDetectionzijntrue,lib/models/parts/app_settings.dart:414-415,lib/state/settings_provider.dart:277) en:ImageFaceScanner.countFaces(lib/services/privacy/image_face_scan_io.dart:184) doetcv.imdecodeop volle resolutie (tot 40 MP) en daarna YuNet op drie schalen (kFaceScanWidths = [1920, 1280, 640], regel 40). Dat is één ononderbroken FFI-aanroep: zolang hij loopt, tekent de app geen frame en reageert hij niet op invoer (ook niet op de sluitknop).lib/state/image_privacy_provider.dart:170). De memo (pad+mtime+grootte, #911) vangt herhaling op, maar:ref.mounted-toets. Typen tijdens de eerste scan start per toetsaanslag een nieuwe run die dezelfde nog-niet-gecachete foto's opnieuw scant;File.stat()en een gehele herberekening.Meting
Integratietest op macOS (Apple Silicon, native OpenCV),
countFacesper foto, synchroon:Op een gemiddelde Windows 10-laptop is 2–4× zoveel realistisch. Een deck met 40 telefoonfoto's betekent bij openen dus 40 bevriezingen van 150–400 ms achter elkaar, en bij typen tijdens die scan een veelvoud daarvan.
Voorgestelde oplossing
Isolate.runper foto) die het YuNet-model één keer laadt en een seriële wachtrij afwerkt. dartcv-FFI werkt in een gewone isolate; geef de bytes mee alsTransferableTypedData.deckProvider.select((s) => imageSetKey(s.deck))die een string/record van (pad, dia-index, veld) oplevert. Tekst typen raakt die sleutel niet en start dus geen scan.if (!ref.mounted) return;aan het begin van elke iteratie.IMREAD_REDUCED_COLOR_2/4/8kiezen op basis van de kopafmetingen (diefaceScanDimensionsWithinBudgetal leest), zodat een 24 MP-foto nooit op volle grootte in het geheugen komt — de grootste detectieschaal is toch 1920.Wat overeind moet blijven
Dezelfde uitkomsten (aantal gezichten,
unreadablevoor HEIC/te groot), dezelfde juridische grens (alleen het aantal rijen uitlezen, zie kopimage_face_scan.dart), en de export-gate die op de uitslag wacht.Toets
countFaces-aanroepen met een nep-scanner).integration_test/, macOS/Windows/Linux): tijdens een scan van 20 foto's blijft de langste framepauze < 50 ms.Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).