Sprawdzam skuteczność mojej aplikacji, ponieważ zauważyłem, że podczas przewijania upuszcza klatki. Uruchomiłem systrace (na Nexusie 4 z 4.3) i zauważyłem na wyjściu interesting section.Android potrójne buforowanie - oczekiwane zachowanie?
Wszystko jest w porządku na początku. Zooming in on the left section, widzimy, że rysunek zaczyna się od każdej vsync, kończy się z czasem do stracenia i czeka aż do następnej vsync. Ponieważ jest potrójnie buforowany, powinien być wciągany do bufora, który zostanie opublikowany w następującej wersji vsync po zakończeniu.
Przy czwartej wariancie na powiększonym zrzucie ekranu aplikacja wykonuje pewną pracę, a operacja losowania nie kończy się w czasie dla następnej wersji vsync. Jednak nie upuszczamy żadnych klatek, ponieważ poprzednie remisy pracowały z wyprzedzeniem.
Po tym zdarzeniu operacje losowania nie nadrabiają pominiętej vsync. Zamiast tego, tylko jedna operacja losowania zaczyna się od jednej z funkcji vsync, a teraz nie rysują one już o jedną klatkę.
Zooming in on the right section, aplikacja wykonuje więcej pracy i pomija kolejną wersję vsync. Ponieważ nie rysowaliśmy ramy do przodu, ramka w rzeczywistości zostaje tu upuszczona. Potem wraca do rysowania jednej klatki przed sobą.
Czy to oczekiwane zachowanie? Rozumiem, że potrójne buforowanie pozwoliło ci na powrót do zdrowia, jeśli przegapiłeś vsync, ale to zachowanie wygląda tak, jakby opuściło klatkę raz na dwa razy, które przegapiłeś.
Kontynuacja pytania
Po prawej stronie this screenshot, aplikacja jest faktycznie renderowania buforów szybciej niż wyświetlacz jest ich spożywania. Podczas performTraversals # 1 (oznaczonego na zrzucie ekranu) powiedzmy, że bufor A jest wyświetlany, a bufor B jest renderowany. # 1 kończy się na długo przed wersją vsync i umieszcza bufor B w kolejce. W tym momencie, czy aplikacja nie powinna od razu zacząć renderować bufora C? Zamiast tego performTraversals # 2 nie rozpoczyna się do następnej vsync, marnując cenny czas pomiędzy.
W podobnym tonie, jestem nieco zdezorientowany potrzebą waitForever on the left side here. Powiedzmy, że bufor A jest wyświetlany, bufor B jest w kolejce, a bufor C jest renderowany. Kiedy bufor C kończy renderowanie, dlaczego nie jest on natychmiast dodawany do kolejki? Zamiast tego robi to waitForever, aż bufor B zostanie usunięty z kolejki, w którym to momencie dodaje bufor C, dlatego wydaje się, że kolejka zawsze pozostaje w rozmiarze 1, bez względu na to, jak szybko aplikacja renderuje bufory.
Dzięki za odpowiedź! Połączone posty są bardzo użyteczne, ponieważ wiedzą, że systrace pokazuje kolejkę bufora. Nadal mam kilka pytań (dodanych powyżej). –
Dodano więcej odpowiedzi. – fadden
Zaktualizowano trochę więcej. – fadden