Karty w tle mogą mieć znaczny negatywny wpływ na wydajność przeglądarki, zwłaszcza na czas pracy na baterii. Aby temu zaradzić, od kilku lat Chrome stosuje 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 opisie bieżących zasad w Chrome 57. Strategię długoterminową i dalsze plany znajdziesz w tym dokumencie.
Optymalizacja aplikacji na potrzeby działania w tle
Deweloperzy powinni mieć świadomość, że użytkownicy często mają wiele kart otwartych w tle, co może mieć poważny wpływ na zużycie energii i czas pracy baterii. Działania w tle należy ograniczyć do minimum, chyba że są absolutnie niezbędne do zapewnienia określonych wrażeń użytkownikom. 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 witryn 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 funkcji requestAnimationFrame()
, gdy strona jest w tle.
Takie działanie jest stosowane od 2011 r.
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 je partiami raz na sekundę, dzięki czemu liczba wybudzeń procesów jest utrzymywana do minimum. Strony, na których odtwarzany jest 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 kolejce następny dźwięk.
Pamiętaj, że dźwięk jest słyszalny tylko wtedy, gdy w Chrome wyświetla się ikona dźwięku. Cisza nie jest podstawą do zwolnienia z opłat.
Ograniczanie działania licznika czasu w tle na podstawie budżetu
W Chrome 57 udostępniamy ograniczanie licznika czasu na podstawie budżetu, które jest kolejnym rozszerzeniem mechanizmu wyrównywania liczników czasu. Ograniczenie to nakłada dodatkowy limit na wykorzystanie procesora przez licznik czasu działający 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 może podlegać ograniczeniom czasowym.
- Zadanie licznika czasu może być uruchamiane tylko wtedy, gdy budżet czasu nie jest ujemny.
- Po wykonaniu minutnika jego czas działania jest odejmowany od budżetu.
- Budżet jest stale odnawiany w czasie (obecnie ustawiony na szybkość 0,01 sekundy na sekundę). Pamiętaj, że tę szybkość odnawiania budżetu można dostosować, gdy Chrome zbierze więcej danych o zachowaniu ograniczania.
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. W takich przypadkach nadal obowiązuje zasada uruchamiania liczników raz na sekundę.
Pamiętaj, że ten mechanizm używa czasu rzeczywistego, a nie czasu procesora. Jest to dobre przybliżenie czasu procesora i kara za blokowanie głównego wątku przez długi czas.
Pamiętaj też, że jeśli używasz długich zadań w tle, 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 co najmniej 50 ms, zgodnie ze wskazówkami dotyczącymi wydajności, i użyj detektora visibilityChange
, aby uniknąć niepotrzebnej pracy w tle.
Odmowa
Chrome udostępnia flagę --disable-background-timer-throttling
na potrzeby takich przypadków użycia, jak uruchamianie zestawów testowych i innych wymagających od użytkowników operacji obliczeniowych.