Birinci Test
Bu amaç için özel olarak bir test yazdım:
Kare Hızı Dağılımı: setInterval vs requestAnimationFrame
Not: Bu test oldukça CPU yoğundur. requestAnimationFrame
IE 9- ve Opera 12- tarafından desteklenmez.
Test, bir setInterval
ve requestAnimationFrame
farklı tarayıcılarda çalışmak için gereken süreyi günlüğe kaydeder ve sonuçları bir dağıtım şeklinde verir. setInterval
Farklı ayarlar altında nasıl çalıştığını görmek için milisaniye sayısını değiştirebilirsiniz . gecikmeler açısından a'ya setTimeout
benzer şekilde çalışır setInterval
. requestAnimationFrame
genellikle tarayıcıya bağlı olarak varsayılan olarak 60 fps'dir. Farklı bir sekmeye geçtiğinizde veya etkin olmayan bir pencereniz olduğunda ne olacağını görmek için sayfayı açmanız, farklı bir sekmeye geçmeniz ve bir süre beklemeniz yeterlidir. Etkin olmayan bir sekmede bu işlevler için geçen süreyi günlüğe kaydetmeye devam eder.
Test İki
Bunu test etmenin başka bir yolu da zaman damgasını tekrar tekrar setInterval
ve requestAnimationFrame
ayrı bir konsolda görüntülemek. Sekmeyi veya pencereyi devre dışı bıraktığınızda ne sıklıkta güncellendiğini (veya hiç güncellenip güncellenmediğini) görebilirsiniz.
Sonuçlar
Chrome
Chrome setInterval
, sekme etkin olmadığında minimum aralığı yaklaşık 1000 ms ile sınırlar . Aralık 1000 ms'den yüksekse, belirtilen aralıkta çalışır. Pencerenin odak dışında olması önemli değildir, aralık yalnızca farklı bir sekmeye geçtiğinizde sınırlanır. requestAnimationFrame
sekme etkin olmadığında duraklatılır.
// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;
https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Chrome'a benzer şekilde, Firefox setInterval
sekme (pencere değil) etkin olmadığında minimum aralığı yaklaşık 1000 ms ile sınırlar . Ancak, requestAnimationFrame
sekme etkin olmadığında katlanarak daha yavaş çalışır ve her kare 1s, 2s, 4s, 8s vb.
// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms
https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE setInterval
, sekme etkin olmadığında gecikmeyi sınırlamaz , ancak requestAnimationFrame
etkin olmayan sekmelerde duraklar . Pencerenin odak dışında olup olmadığı önemli değildir.
Kenar
Kenar 14'ten başlayarak, setInterval
etkin olmayan sekmelerde 1000 ms ile sınırlanır. requestAnimationFrame
etkin olmayan sekmelerde her zaman duraklatılır.
Safari
Tıpkı Chrome gibi, Safari setInterval
de sekme etkin olmadığında 1000 ms'de kapanır. requestAnimationFrame
duraklatılır.
Opera
Webkit motorunun kabul edilmesinden bu yana Opera, Chrome ile aynı davranışı sergiliyor. setInterval
1000ms ile sınırlıdır ve requestAnimationFrame
sekme etkin olmadığında duraklatılır.
özet
Etkin olmayan sekmeler için tekrarlama aralıkları:
setInterval requestAnimationFrame
Chrome
9- etkilenmez desteklenmez
10 etkilenmedi duraklatıldı
11+> = 1000 ms duraklatıldı
Firefox
3- etkilenmez desteklenmez
4 etkilenmeyen 1s
5+> = 1000 ms 2 n s (n = işlem yapılmadığından beri geçen kare sayısı)
IE
9- etkilenmez desteklenmez
10+ etkilenmedi duraklatıldı
kenar
13- etkilenmez duraklatıldı
14+> = 1000 ms duraklatıldı
Safari
5- etkilenmez desteklenmez
6 etkilenmedi duraklatıldı
7+> = 1000 ms duraklatıldı
Opera
12- etkilenmez desteklenmez
15+> = 1000 ms duraklatıldı