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. requestAnimationFrameIE 9- ve Opera 12- tarafından desteklenmez.
Test, bir setIntervalve requestAnimationFramefarklı tarayıcılarda çalışmak için gereken süreyi günlüğe kaydeder ve sonuçları bir dağıtım şeklinde verir. setIntervalFarklı 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 setTimeoutbenzer şekilde çalışır setInterval. requestAnimationFramegenellikle 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 setIntervalve requestAnimationFrameayrı 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. requestAnimationFramesekme 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 setIntervalsekme (pencere değil) etkin olmadığında minimum aralığı yaklaşık 1000 ms ile sınırlar . Ancak, requestAnimationFramesekme 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 requestAnimationFrameetkin olmayan sekmelerde duraklar . Pencerenin odak dışında olup olmadığı önemli değildir.
Kenar
Kenar 14'ten başlayarak, setIntervaletkin olmayan sekmelerde 1000 ms ile sınırlanır. requestAnimationFrameetkin olmayan sekmelerde her zaman duraklatılır.
Safari
Tıpkı Chrome gibi, Safari setIntervalde sekme etkin olmadığında 1000 ms'de kapanır. requestAnimationFrameduraklatılır.
Opera
Webkit motorunun kabul edilmesinden bu yana Opera, Chrome ile aynı davranışı sergiliyor. setInterval1000ms ile sınırlıdır ve requestAnimationFramesekme 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ı