Próbuję zbudować gładką pętlę javascript przeglądarki animacji 60 klatek na sekundę. Zauważyłem, że garbage collector wciąga i dodaje zmienny niezerowy czas do klatek animacji. Zacząłem od śledzenia przydziałów w moim kodzie, a następnie odizolowałem pętlę od siebie. Używałem requestAnimationFrame
i odkryłem, że w rzekomo "pustej" pętli nadal powoduje alokacje każdej iteracji i uruchamia garbage collector. Frustrująco to zdarza się również w innych mechanizmach zapętlenia.JavaScript jak stworzyć darmową pętlę animacji alokacji, aby uniknąć zbieracza śmieci?
Poniżej zamieściłem kilka jsfiddles i zrzuty ekranu demonstrujące przykładowe "puste pętle". Wszystkie próbki są z ~ 5 sekundowych linii czasu.
W tym momencie szukam najlepszego rozwiązania, które zminimalizuje odśmiecanie. Z poniższych przykładów wygląda na to, że requestAnimationFrame jest najgorszą opcją w tym względzie.
requestAnimationFrame
https://jsfiddle.net/kevzettler/e8stfjx9/
var frame = function(){
window.requestAnimationFrame(frame);
};
window.requestAnimationFrame(frame);
setInterval
https://jsfiddle.net/kevzettler/p5LbL1am/
var frame = function(){
//literally nothing
};
window.setInterval(frame, 0);
setTimeout
https://jsfiddle.net/kevzettler/9gcs6gqp/
var frame = function(){
window.setTimeout(frame, 0);
}
window.setTimeout(frame, 0);
Czy próbowałeś podjąć sterty migawkę, aby sprawdzić ich rodzaju obiektów, które gromadzą? – Bergi
@Bergi - jak to zrobić? –
@JohnHaugeland https://developers.google.com/web/tools/chrome-devtools/memory-problems/heap-snapshots – Bergi