Eski Cihaz & Kotu Internet - Sifir Donma Plani
Sorun ne?
Muzik calar (player) sarki calarken bazen kisa sureli donuyor. Bu donmeler 117ms ile 223ms arasinda suruyor. Normal bir kullaniciya pek hissettirmese de, eski telefonlarda veya yavas internette ciddi takılmalara yol aciyor.
Neden oluyor?
Player, muzik dosyalarini parcalara (segment) ayirip caliyor. Bu parcalari cozumlemek (decode etmek) icin agir islem yapiyor ve bu islem tarayicinin ana is parcaciginda (main thread) calisiyor. Yani sarki calarken ayni anda ekranin tepki vermesi gereken islem de bloke oluyor.
Neden onemli?
Eski cihazlarda (2GB RAM, 2 cekirdek CPU) veya 3G/2G baglantida bu donmeler cok daha belirgin oluyor. Kullanici sarkiyi acinca 1-2 saniye bos ekran gorebilir, ileri/geri suruklerken takilma yasayabilir.
Nasil duzeltilecek?
Agir islemi arka plan islemine (Web Worker) tasiyacagiz. Ayrica player'in cihazin gucune ve internet hizina gore kendini otomatik ayarlamasini saglayacagiz. Eski telefonda dusuuk kalite, iyi telefonda yuksek kalite.
old-device-checker.js
Cihaz profilini tespit ediyor (RAM, CPU, tarayici surumu) ama player ayarlarini DEGISTIRMIYOR
Durum: Pasif - kullanilmiyor
speed-tester.js
Baglanti hizini oluyor ama HLS konfigurasyonunu ETKILEMIYOR
Durum: Pasif - sadece raporluyor
buffer-monitor.js
Buffer sorunlarini algilayip hiz testi tetikliyor
Durum: Aktif - ama sadece izliyor
enableWorker: false)Etki
HLS.js segment cozumlemesi (ADTS demux, MP3 frame parsing) tamamen main thread'de calisiyor. Her 2-4 saniyede yeni segment geldiginde ana is parcacigi 100-200ms bloke oluyor.
player-core.js:296
Gecikme: 150-223ms
Eski cihazlara etkisi:
2 cekirdekli CPU'da segment parsing 300-500ms surebilir. Kullanici ekranin donmasini hisseder.
Etki
Audio element'in ontimeupdate eventi saniyede 4-250 kez ateslenebiliyor (tarayiciya bagli). Her ateslendiginde preload kontrolu, crossfade zamanlama hesabi ve UI guncelleme yapiyor. 5 farkli yerde ayni handler kayitli.
Eski cihazlara etkisi:
Firefox'ta saniyede 250 kez ateslenebilir. Eski cihazda her biri 0.5ms surse = 125ms/sn CPU yuku sadece bu handler'dan.
Etki
setInterval(fn, 100) ile saniyede 10 kez progress guncelleniyor. Bu ontimeupdate ile AYNI isleri yapiyor - cift islem. Muzik calarda 250ms (saniyede 4) yeterli.
Etki
HLS buffer ayarlari sabit: 20sn buffer, 30MB limit, baslangic kalitesi belirtilmemis. Eski cihazda ayni 30MB buffer RAM'i doldurur. Yavas baglantida en yuksek kaliteden baslar, sonra duser = ilk calmada uzun bekleme.
Yavas baglantiya etkisi:
3G'de (1.5Mbps) ilk segment 270kbps kalitede gelirse ~1.5sn bekler. 32kbps'den baslasa 0.2sn'de baslar.
Etki
getActiveHlsAudio() fonksiyonu her cagirildiginda document.getElementById() yapiyor. Saniyede ~10 kez DOM'a erisim. Sonuc her zaman ayni ama cache'lenmiyor.
Etki
Sarkinin 10. saniyesinde sonraki sarki preload ediliyor. 3G/2G baglantida bu preload mevcut sarkinin buffer'ini doldurmasini engelliyor. Sonuc: mevcut sarki takilir.
Yavas baglantiya etkisi:
2G'de (250kbps): Mevcut sarki 32kbps + preload 32kbps = 64kbps. Baglanti 250kbps olsa bile her ikisi icin de takilma olusabilir.
Tum degisiklikler tek dosyada: player-core.js
- enableWorker: false, + enableWorker: true,
HLS segment parsing Web Worker'a tasini. Tarayici desteklemezse hls.js otomatik fallback yapar. Safari zaten native HLS kullanir, etkilenmez.
Normal Cihaz (4G)
Eski Cihaz / 3G
Tespit: navigator.deviceMemory (RAM), navigator.hardwareConcurrency (CPU), navigator.connection.effectiveType (baglanti)
const now = performance.now(); if (now - self._lastTimeupdateProcess < 250) return; self._lastTimeupdateProcess = now;
Saniyede 250 kez yerine max 4 kez calisir. Kullanici fark edemez cunku muzik calari icin 250ms yeterli hassasiyet.
Main thread yuku %60 azalir. Progress bar hareketi hala akici gorulur (saniyede 4 guncelleme yeterli).
Saniyede ~10 DOM sorgusu yerine sadece audio ID degistiginde 1 kez sorgu yapilir.
2G
Preload KAPALI
3G
Son 5sn'de
4G+
Normal (10sn)
| Adim | Fix | Risk | Beklenen Etki | Rollback |
|---|---|---|---|---|
| 1 | enableWorker: true | Dusuk | 150-223ms gecikmeler yok olur | Tek satir |
| 2 | DOM cache | Cok dusuk | 10 DOM sorgu/sn → 0 | 5 satir |
| 3 | Throttle + interval | Dusuk | Main thread yuku %60 azalir | Sayi degisikligi |
| 4 | Adaptif HLS config | Orta | Eski cihaz: hizli baslangic + az RAM | Config geri al |
| 5 | Preload erteleme | Dusuk | Yavas nette buffer takilmasi yok | Guard kaldir |
| Metrik | Simdi | Sonra |
|---|---|---|
| Max longtask | 223ms | <50ms |
| ontimeupdate/sn | 4-250 | Max 4 |
| Progress interval | 100ms (10/sn) | 250ms (4/sn) |
| DOM sorgu/sn | ~10 | ~0 (cached) |
| HLS demux thread | Main thread | Web Worker |
| 2G baglanti preload | Hemen (bant genisligi calar) | Kapali (mevcut sarkiya odaklanir) |