Skip to content

perf: Web-Canvas cached die fertige Zeichnung, Live-Strich ohne Komplett-Redraw (#358) - #361

Merged
S540d merged 1 commit into
testingfrom
perf/web-canvas-cache
Oct 12, 2026
Merged

S540d merged 1 commit into
testingfrom
perf/web-canvas-cache

Conversation

@S540d

@S540d S540d commented Oct 12, 2026

Copy link
Copy Markdown
Owner

Pull Request

Beschreibung

Teil von #358: Die Web-Zeichenfläche (components/DrawingCanvas.web.tsx) hat bei jeder Mausbewegung alles neu gezeichnet. Alle Striche und jeder gespeicherte Fill (voller getImageData → Flood-Fill-Scan → putImageData über die Fläche) liefen erneut, weil currentPath im Redraw-Effekt stand.

Jetzt zwei Effekte:

  • Basis-Effekt (paths, Größe, onDrawingChange): rendert die fertige Zeichnung und cached sie in einem Offscreen-Canvas (snapshotRef).
  • Live-Strich-Effekt (currentPath, Farbe, Stärke, Tool): kopiert den Snapshot zurück und zeichnet nur den aktuellen Strich darüber.

Außerdem gibt es EMPTY_PATHS als stabilen Default. Vorher erzeugte das Default-[] bei jedem Render ein neues Array und löste den Basis-Effekt jedes Mal aus.

Messung (neuer Test, 20 Moves, 2 gespeicherte Fills): getImageData-Aufrufe vorher 44, jetzt 2.

Nicht enthalten (#358 bleibt offen)

Der Replay-Teil: Dort kommt pro Frame ein neues paths-Array. Im Replay wird die Skalierung aus den sichtbaren Pfaden berechnet und ändert sich deshalb von Frame zu Frame. Ein Prefix-Cache wäre dort nicht ohne Verhaltensänderung möglich. Native (computeNativeFillLayers) ist ebenfalls unverändert. Die fertigen Striche dort sind seit #356 bereits gecacht.

Art der Änderung

  • Bugfix
  • Neue Funktion
  • Breaking Change
  • Dokumentation Update
  • Performance (soll das Verhalten nicht ändern)

Cross-Platform Kompatibilität

Betrifft dieser PR plattformspezifischen Code? Ja, nur DrawingCanvas.web.tsx. Das document.createElement('canvas') steht in einer reinen Web-Datei und trägt den // platform-safe-Kommentar. Native ist unverändert.

Testing Checklist

  • Keine TypeScript Errors, keine ESLint Warnings, Prettier sauber
  • npm test und test:ci: 459/459 grün, expo export --platform web ok
  • Neuer Test DrawingCanvas.web.test.tsx (3 Tests); der Kern-Test schlägt gegen den alten Code fehl (erwartet 2, erhalten 44)
  • Im echten Browser (Playwright, /creative) geprüft: Rechteck zeichnen → füllen → zweiten Strich ziehen. Die Füllung bleibt beim Live-Strich erhalten, der Live-Strich erscheint korrekt.
  • Auf echtem Touch-Gerät (Tablet) noch nicht gemessen

🤖 Generated with Claude Code

https://claude.ai/code/session_017fxbsNALrmwMj7LGMDPLw2


Generated by Claude Code

…Redraw (#358)

Der Redraw-Effekt in DrawingCanvas.web.tsx hing an currentPath und lief bei
jeder Mausbewegung komplett durch: clear, alle Striche, jeder Fill mit vollem
getImageData/Flood-Fill/putImageData.

Jetzt zwei Effekte:
- Basis-Effekt (paths, Größe): rendert die fertige Zeichnung und cached sie
  in einem Offscreen-Canvas
- Live-Strich-Effekt (currentPath, Farbe, Stärke, Tool): kopiert den
  Snapshot zurück und zeichnet nur den aktuellen Strich

Zusätzlich EMPTY_PATHS als stabiler Default (kein neues []-Array pro Render).
Test zählt getImageData-Aufrufe: vorher 44 für 20 Moves mit 2 Fills, jetzt 2.

Nicht enthalten: Replay-Frames (Skalierung ändert sich pro Frame, bleibt in #358 offen).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fxbsNALrmwMj7LGMDPLw2
@github-actions

Copy link
Copy Markdown

🔀 Mergeability-Report

✅ Konfliktfrei mergebar (unstable).
✅ Ziel-Branch testing ist policy-konform.

CI-Checks: ✅ keine fehlgeschlagenen Checks

⏳ mergeability / mergeability
⏳ ⚙️ Workflow Linting / actionlint
⏳ 🔍 Code Quality & Linting
⏳ 🔧 Platform Compatibility
⏳ 🔒 Security Audit
✅ 🔐 Docs Privacy Check
✅ 🔑 Keystore & Credential Scan
⏳ Analyze (javascript-typescript)
⏳ Analyze (actions)

Merge-Checkliste

  • CI-Checks grün
  • Keine Merge-Konflikte
  • Ziel-Branch korrekt
  • (Optional) tiefes KI-Review via /review aus Claude Code (Pro-Abo, ohne API-Kosten)

Kostenlos generiert von reusable-mergeability.yml · keine API-Kosten · review-gate: success

@S540d
S540d merged commit c2cca20 into testing Oct 12, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants