Karty w tle w Chrome 57

Karty w tle mogą mieć znaczący negatywny wpływ na wydajność przeglądarki, zwłaszcza na czas pracy na baterii. Aby temu zaradzić, w Chrome umieszczamy różne ograniczenia dotyczące kart działających w tle. W ostatnim czasie wprowadziliśmy wiele ulepszeń, a w tym dokumencie znajdziesz omówienie zasad Chrome. Ten dokument skupia się na opisywaniu bieżących zasad obowiązujących w Chrome 57. Strategię długoterminową i dalsze plany znajdziesz w tym dokumencie.

Optymalizacja aplikacji na potrzeby działania w tle

Programiści stron internetowych powinni pamiętać, że użytkownicy często mają wiele otwartych kart w tle. Może też mieć duży wpływ na zużycie energii i żywotność baterii. Praca w tle należy ograniczyć do minimum, chyba że jest to absolutnie konieczne, konkretne wrażenia użytkownika. Interfejs Page Visibility API należy używać do wykrywania, kiedy strona jest w tle, i wstrzymywania wszystkich niepotrzebnych działań, takich jak aktualizacje wizualne.

W przypadku niektórych stron: Ta prosta optymalizacja może zmniejszyć wykorzystanie procesora nawet o 75%:

var doVisualUpdates = true;

document.addEventListener('visibilitychange', function(){
    doVisualUpdates = !document.hidden;
});

function update() {
    if (!doVisualUpdates) {
    return;
    }
    doStuff();
}

Zasady

requestAnimationFrame()

Zgodnie z dokumentacją Chrome nie wywołuje requestAnimationFrame(), gdy strona jest w tle. To ustawienie obowiązuje od 2011 roku.

Wyrównanie licznika czasu w tle

Od wersji Chrome 11 każdy niezależny minutnik jest uruchamiany nie częściej niż raz na sekundę. Chrome uruchamia te regulatory w partiach raz na sekundę, aby ograniczyć do minimum liczbę procesów aktywowanych przez timer. Strony odtwarzające dźwięk są uważane za widoczne dla użytkownika i nie podlegają ograniczeniom działania licznika czasu w tle. Wyjątek obowiązuje przez kilka sekund po zakończeniu odtwarzania dźwięku, aby aplikacje mogły ustawić w kole następny dźwięk.

Pamiętaj, że dźwięk jest uznawany za słyszalny tylko wtedy, gdy Chrome pokazuje ikonę dźwięku. Ciche strumienie audio nie kwalifikują się do wyjątków.

Ograniczanie licznika czasu w tle na podstawie budżetu

Dostawa w Chrome 57, ograniczanie licznika czasu na podstawie budżetu jest dalszym rozszerzeniem mechanizmu wyrównywania licznika czasu, przez wprowadzenie dodatkowego ograniczenia wykorzystania procesora przez licznik czasu w tle. Działa on w ten sposób:

  • Każda karta w tle ma budżet czasu (w sekundach) przeznaczony na minutniki działające w tle.
  • Po 10 sekundach działania w tle strona podlega ograniczeniom budżetu czasowego.
  • Zadanie licznika czasu może być uruchamiane tylko wtedy, gdy budżet czasu nie jest ujemny.
  • Po zakończeniu licznika czasu jego działania jest odejmowane od budżetu.
  • Budżet jest stale regenerowany z czasem (obecnie wynosi 0,01 sekundy na sekundę). Pamiętaj, że tę szybkość odnawiania budżetu można dostosować, gdy Chrome zbierze więcej danych o ograniczaniu szybkości.

Istnieją pewne automatyczne wyjątki od tego ograniczenia:

  • Aplikacje odtwarzające dźwięk są uznawane za pierwszy plan i nie są ograniczane.
  • Aplikacje z połączeniami w czasie rzeczywistym (WebSockets i WebRTC), aby uniknąć zamykania tych połączeń z powodu przekroczenia limitu czasu. Reguła czasu działania „raz na sekundę” jest wciąż stosowane w tych przypadkach.

Zwróć uwagę, że ten mechanizm wykorzystuje czas działania, a nie czas pracy procesora. Jest to dobre przybliżenie czasu pracy procesora i kart blokujących główny wątek za długi czas.

Pamiętaj też, że jeśli używasz długich zadań w tle, Twoja aplikacja może być ograniczana przez długi czas (do 100 razy dłuższy niż czas trwania zadania). Podziel pracę na fragmenty o długości nieprzekraczającej 50 ms zgodnie z wytycznymi dotyczącymi wydajności i użyj listenera visibilityChange, aby uniknąć niepotrzebnej pracy w tle.

Odmowy

Chrome udostępnia flagę --disable-background-timer-throttling do takich zastosowań jak uruchamianie zestawów testów i inne wymagające dużych zasobów obliczeniowych operacje zatwierdzone przez użytkownika.