Ekran kapanan / uygulama değişen cihazlarda donma problemi ve çözüm planı
Kullanıcı telefonu cebine koyuyor, müzik dinliyor. 40 dakika sonra ekrana bakıyor.
O anda ekran 2-3 saniye donuyor, hiçbir butona basılamıyor. Kullanıcı "donuyor" diyor.
Aslında müzik hiç durmamış. Donma sadece ekrandaki görsel arayüzde.
Bunun sebebi Chrome'un "pil tasarrufu" özelliği — arka plandaki sekmelerin işlem gücünü kısıyor,
öne gelince birikmiş işleri bir anda yapıyor.
| setTimeout / setInterval | İstediğin süre |
| requestAnimationFrame | ~16ms (60fps) |
| JS execution | Sürekli çalışır |
| Audio playback | Normal |
| setTimeout / setInterval | Minimum 1000ms |
| requestAnimationFrame | Tamamen durur |
| JS execution | Birikir → öne gelince patlar |
| Audio playback | Etkilenmez ✓ |
test@muzibu.com kullanıcısının 103 dakikalık oturumunda ne oldu:
Her katman bağımsız çalışır. Katman 1 tek başına sorunu %90 çözer.
Kullanıcı ekranı kapattığında veya başka uygulamaya geçtiğinde debug sistemi kendini "uyku moduna" alacak. Tüm timer'lar (panel güncelleme, metrik toplama, jank algılama) duracak. Ekrana geri dönüldüğünde kademeli olarak uyanacak — hepsi bir anda değil, sırayla. Böylece Chrome'un "birikmiş iş patlaması" hiç olmayacak.
Katman 1 çalışsa bile, Chrome'un kendi iç mekanizmaları (layout, paint, style recalc) öne gelince biraz yoğunluk yaratabilir. Bu yüzden arka plandan döndükten sonra 5 saniye boyunca PROC-HOLD algılama kapalı tutulacak. Bu sürede oluşan gecikmeler sayılmayacak ve rapora yazılmayacak. Böylece yanlış alarm (false positive) sıfırlanır.
Eğer arka planda da metrik toplamak istiyorsak (kullanıcı ekrana bakmasa bile bellek, ağ durumu vs. kayıt altına almak),
bu işi ayrı bir "Worker" thread'ine taşıyabiliriz. Worker'lar Chrome throttle'ından etkilenmez —
arka planda bile tam hızla çalışır. Ana thread'e hiç yük bindirmez.
Ama: Bu büyük bir mimari değişiklik. Katman 1+2 sorunu zaten çözüyor.
Bu katman sadece "arka planda da veri toplama" ihtiyacı varsa gerekli.
Katman 1+2 uygulandıktan sonra aynı senaryo nasıl görünecek:
| PROC-HOLD | 20 olay |
| JANK | 5281 olay |
| Tanılama | SEV-1 KRİTİK |
| Kullanıcı deneyimi | Ekran 2-3sn donuk |
| Müşteri şikayeti | "Donuyor" |
| PROC-HOLD | 0 olay |
| JANK | ~50 olay (gerçek) |
| Tanılama | ALL-CLEAR |
| Kullanıcı deneyimi | Anlık geçiş |
| Müşteri şikayeti | Yok |
| Dosya | Katman | Değişiklik | Satır |
|---|---|---|---|
| performance-debug.js | K1 | visibilitychange listener: hidden→timer stop, visible→kademeli başlat | ~1500-1520 |
| performance-debug.js | K1 | collectMetrics(), updatePanel() — clearInterval / setInterval toggle | ~1180, ~3200 |
| performance-debug.js | K2 | PROC-HOLD algılama: visShowTimestamp + grace period kontrolü | ~1340-1360 |
| performance-debug.js | K2 | JANK algılama: arka plan dönüşünde 5sn suppress | ~1330 |
| performance-debug.js | K1 | generateReport(): arka plan süresini raporda göster | ~1700 |