Das Spiel zeigt beim Start massive Frame-Drops (100-300ms requestAnimationFrame Handler), die zu Freezes/Lags führen. Die Chrome DevTools Performance-Analyse zeigt Violations, aber nicht genau, welcher Code verantwortlich ist.
Ich habe ein Performance-Monitoring-System implementiert, das:
- Frame-Times detailliert misst
- Code-Sections (z.B. Rendering, Physics, UI) einzeln trackt
- Bottlenecks identifiziert und loggt
- Statistiken über mehrere Frames sammelt
Öffne die Browser-Konsole (F12) und gib ein:
PerformanceMonitor.init();Das System startet sofort mit der Messung. Du siehst:
🔍 Performance Monitor initialized
📊 Call PerformanceMonitor.report() to see detailed analysis
🛑 Call PerformanceMonitor.stop() to disable monitoring
- Navigiere zum Spiel (Character Select → Stage Select → Spielstart)
- Spiele mindestens 10-15 Sekunden, damit das System Daten sammelt
- Die ersten Frames werden automatisch als "kritisch" geloggt, wenn sie >33ms brauchen
Du siehst automatische Warnungen in der Konsole:
🚨 CRITICAL FRAME #5: 287.45ms
📊 Frame #5 Breakdown (287.45ms total)
🔴 Renderer_UI: 198.23ms (69.0%)
🟡 Physics_Update: 45.12ms (15.7%)
⏱️ Particle_Update: 12.45ms (4.3%)
Nach dem Spielen, gib in der Konsole ein:
PerformanceMonitor.report();Du erhältst einen detaillierten Report:
═══════════════════════════════════════
📊 PERFORMANCE REPORT
═══════════════════════════════════════
🎞️ Total frames analyzed: 450
⏱️ Average frame time: 18.45ms (54.2 fps)
📈 Min / Max: 8.23ms / 287.45ms
📊 Percentiles:
50th: 16.12ms (62.0 fps)
95th: 25.67ms (39.0 fps)
99th: 98.34ms (10.2 fps)
⚠️ Slow frames (>16.67ms): 145 (32.2%)
🚨 Critical frames (>33.33ms): 12 (2.7%)
═══════════════════════════════════════
🔥 TOP 5 SLOWEST FRAMES:
───────────────────────────────────────
Frame #5: 287.45ms
└─ Renderer_UI: 198.23ms (69.0%)
└─ BeatBar: 45.12ms (15.7%)
└─ StageAnimations: 22.34ms (7.8%)
Frame #12: 156.78ms
└─ Renderer_WebGLInit: 142.34ms (90.7%)
└─ Physics_Update: 8.12ms (5.2%)
...
═══════════════════════════════════════
📈 SECTION PERFORMANCE BREAKDOWN:
───────────────────────────────────────
Renderer_UI:
Avg: 8.45ms | Max: 198.23ms | Calls: 450
BeatBar:
Avg: 3.12ms | Max: 45.12ms | Calls: 450
Physics_Update:
Avg: 2.89ms | Max: 23.45ms | Calls: 450
Renderer_Players:
Avg: 1.23ms | Max: 12.34ms | Calls: 450
...
═══════════════════════════════════════
Dies zeigt die 5 langsamsten Frames und welche Code-Sections die meiste Zeit verbraucht haben.
Beispiel:
Frame #5: 287.45ms
└─ Renderer_UI: 198.23ms (69.0%)
→ Frame #5 brauchte 287ms, davon 69% (198ms) im UI-Rendering. Das ist das Problem!
Zeigt durchschnittliche und maximale Zeiten pro Code-Section über alle Frames.
Beispiel:
BeatBar:
Avg: 3.12ms | Max: 45.12ms | Calls: 450
→ Beatmatch-Bar braucht durchschnittlich 3ms, aber einmal 45ms (wahrscheinlich beim ersten Rendering).
Problem: WebGL wird während des ersten Frames initialisiert (nicht während Warmup).
Lösung:
- Prüfe, ob
startGame()korrekt WebGL initialisiert - Prüfe, ob
state.webglInitializedgesetzt wird
Problem: Font-Rendering beim ersten Mal ist langsam (Font-Metrics werden berechnet).
Lösung:
- Prüfe, ob
Renderer.warmupFonts()während Warmup aufgerufen wird - Stelle sicher, dass
warmupCanvasContext()Fonts vorlädt
Problem: Zu viele Stage-Animationen oder komplexe Berechnungen.
Lösung:
- Prüfe Anzahl der
state.stageAnimations - Optimiere Beat-Sync-Berechnungen
Problem: UI-Rendering ist zu komplex (viele Berechnungen oder Text-Rendering).
Lösung:
- Prüfe
drawCentralBeatBar()– viele String-Operationen? - Nutze Font-Caching (
setFontCached()) - Vermeide
ctx.measureText()in jedem Frame
Wenn du nicht für jeden langsamen Frame eine Warnung sehen willst:
PerformanceMonitor.setLogging(false);PerformanceMonitor.clear();PerformanceMonitor.stop();PerformanceMonitor.init();Falls du weitere Bereiche messen willst, kannst du eigene Sections hinzufügen:
// Vor dem zu messenden Code
if (window.PerformanceMonitor?.isEnabled) {
window.PerformanceMonitor.startSection("MeinCodeBereich");
}
// Dein Code hier...
doSomethingExpensive();
// Nach dem zu messenden Code
if (window.PerformanceMonitor?.isEnabled) {
window.PerformanceMonitor.endSection("MeinCodeBereich");
}Wichtig: Sections müssen genau den gleichen Namen bei Start und Ende haben!
Das System misst bereits folgende Bereiche:
WebGL_FallbackCheck– Prüft ob WebGL nachträglich initialisiert werden mussPhysics_Update– Physics-Engine UpdateParticle_Update– Particle-System UpdateRenderer_Full– Gesamtes Rendering
Renderer_Clear– Canvas leerenRenderer_WebGLInit– WebGL Initialisierung (Fallback)Renderer_Players– Player-Sprites rendernRenderer_Effects– Effects/Particles/Projectiles rendernRenderer_UI– UI-Elemente rendernStageAnimations– Stage-Hintergrund-AnimationenBeatBar– Beatmatch-Leiste (oft der Bottleneck!)
- Run Performance Monitor und schaue dir den Report an
- Identifiziere die Top-Bottlenecks (welche Sections sind am langsamsten?)
- Prüfe ob Warmup-Funktionen korrekt laufen:
- Wird
Renderer.warmupFonts()aufgerufen? - Ist WebGL vor dem ersten Frame initialisiert?
- Wird
- Teste Fixes und vergleiche die Reports vorher/nachher
→ Stelle sicher, dass performance-monitor.js vor main.js geladen wird (siehe index.html)
→ Du hast PerformanceMonitor.init() vergessen – rufe es in der Konsole auf
→ Spiele mindestens 5-10 Sekunden, damit das System Frames sammeln kann
→ Standardmäßig werden nur langsame Frames (>16.67ms) detailliert gespeichert. Das ist normal!
// 1. Monitoring starten
PerformanceMonitor.init();
// 2. Spiel starten und spielen (10-15 Sekunden)
// ... Game läuft ...
// 3. Report anzeigen
PerformanceMonitor.report();
// 4. Wenn du mehr Details willst, schau dir die automatischen Logs an
// (die wurden schon während dem Spielen ausgegeben)
// 5. Monitoring stoppen (optional)
PerformanceMonitor.stop();Falls das Monitoring selbst Performance-Probleme verursacht, kannst du es jederzeit mit PerformanceMonitor.stop() deaktivieren. Die Overhead sollte minimal sein (<0.5ms pro Frame).
Viel Erfolg beim Debuggen! 🚀