Dlaczego włączenie akceleracji sprzętowej w CSS3 spowalnia wydajność?


82

Przenoszę 6000 małych elementów div w eksperymencie css3 przy użyciu przejścia od top: 0do top: 145pxdo testowania wydajności.

Korzystanie żadnego sprzętową akcelerację biegnie gładka na Google Chrome.

Jeśli włączę akcelerację sprzętową poprzez translateZ(0)wydajność, stanie się okropna.

Dlaczego to jest takie?

Oto mój przykładowy kod: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


Aktualizacja (2014-11-13): Ponieważ to pytanie wciąż przyciąga uwagę, chciałbym zwrócić uwagę, że sam problem nadal wydaje się istnieć, chociaż wspomniane jąkanie może nie być już widoczne w dostarczonej wersji demonstracyjnej na nowoczesnym sprzęcie . Starsze urządzenia mogą nadal mieć problemy z wydajnością.


9
Prawdziwe pytanie brzmi: dlaczego niektóre przeglądarki chcą, aby autorzy uciekali się do głupich sztuczek, takich jak transformacje „zerowe”, aby aktywować akcelerację sprzętową. Firefox opiera się na GPU tak bardzo, jak to możliwe, podczas gdy IE wybiera PRZYSPIESZENIE _ WSZYSTKIE_ RZECZY! Niemniej jednak interesujące pytanie, ponieważ wydaje się, że pokazuje, że takie hacki mogą czasami przynieść odwrotny skutek.
BoltClock

2
@ BoltClock'saUnicorn Zasadniczo zgadzam się z tobą. Ale czy nie zawsze tak było w przypadku problemów z różnymi przeglądarkami? :-)
Timo

6
Zadałem to pytanie jakiś czas temu, ale teraz zauważyłem, że liczba przeniesionych elementów wydaje się mieć duży wpływ na problem. Przenoszenie kilku dużych obiektów jest bardziej wydajne niż przenoszenie wielu małych elementów podczas korzystania z akceleracji 3D, ponieważ wszystkie warstwy z akceleracją 3D muszą zostać przeniesione do GPU iz powrotem. Więc nawet jeśli GPU wykonuje dobrą robotę, transfer wielu obiektów może być problemem, więc używanie akceleracji GPU może nie być tego warte.
Timo

1
Nie widzę różnicy w wydajności w przykładzie w żadnej przeglądarce i głosowałem za zamknięciem, ponieważ nie jest już odtwarzalny.
Jason C

1
@Timo Właśnie sprawdziłem na jakimkolwiek najnowszym Firefoksie i Chrome oraz IE11 w 64-bitowym systemie Windows 7, na dość starym ThinkPadzie 2,3 GHz i5 z nVidią 4200M, obie opcje wydają mi się płynne. wzruszając ramionami
Jason C

Odpowiedzi:


100

Zawsze dodaję:

-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;

Podczas pracy z transformacją 3D. Nawet „fałszywe” przekształcenia 3D. Doświadczenie mówi mi, że te dwie linie zawsze poprawiają wydajność, szczególnie na iPadzie, ale także w Chrome.

Przetestowałem na twoim przykładzie i, o ile wiem, działa.

A jeśli chodzi o część twojego pytania "dlaczego" ... nie wiem. Transformacja 3D to młody standard, więc implementacja jest niestabilna. Dlatego jest to właściwość z przedrostkiem: do testów beta. Ktoś mógłby wypełnić raport o błędzie lub pytanie i zlecić zespołowi zbadanie sprawy.

Edycja z 19 sierpnia 2013 r . :

Ta odpowiedź jest regularnie aktywna i właśnie straciłem godzinę, stwierdzając, że IE10 również tego potrzebuje. Więc nie zapomnij:

backface-visibility: hidden;
perspective: 1000;

3
Zrobiłem kolejny test. Zasadniczo to samo, co test nr 1, ale tym razem pozwoliłem -webkit-transform: rotateZ(360deg); pudełkom również obracać się wokół osi z za pośrednictwem dl.dropbox.com/u/17844821/zeug/hwtest2.html - tym razem wersja z akceleracją sprzętową jest szybsza! Jeśli usunę rotację, przyspieszenie sprzętowe spowolni animację. Jeśli twoja teoria jest prawdziwa, to nie powinno działać (bo jedyną różnicą jest to, że dodałem rotateZ(360)). Z drugiej strony, może chrom jest wystarczająco inteligentny, aby zdać sobie sprawę, że do obracania się wokół osi Z nie jest wymagane przerysowywanie tylnej strony tych płytek?
Timo

1
Tak już nie jest w iOS6 :-(
Michael Mullany

2
@Timo Tylko uwaga, w3schools nie jest powiązany z w3c: w3fools.com
Kyle Robinson Young

7
powinieneś dodać, gdzie dodać te wiersze, a nie tylko ogólne „po prostu dodaj to ..” sam wiem gdzie, ale wielu by nie było.
vsync

4
Dodaj go do elementu nadrzędnego animowanych elementów.
mddw

7

Powodem, dla którego animacja była wolniejsza po dodaniu hack ( translateZ(0)) transformacji zerowej, jest to, że każda zerowa transformacja 3D tworzy nową warstwę. Gdy jest zbyt wiele tych warstw, spada wydajność renderowania, ponieważ przeglądarka musi wysyłać dużo tekstur do GPU.

Problem został zauważony w 2013 roku na stronie domowej Apple, która nadużyła hackowania zerowej transformacji. Zobacz http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/

OP również poprawnie zauważył wyjaśnienie w swoim komentarzu :

Przenoszenie kilku dużych obiektów jest bardziej wydajne niż przenoszenie wielu małych elementów podczas korzystania z akceleracji 3D, ponieważ wszystkie warstwy z akceleracją 3D muszą zostać przeniesione do GPU iz powrotem. Więc nawet jeśli GPU wykonuje dobrą robotę, transfer wielu obiektów może być problemem, więc używanie akceleracji GPU może nie być tego warte.


6

Ciekawy. Próbowałem grać z kilkoma opcjami about:flags, szczególnie tymi:

Komponowanie GPU na wszystkich stronach Stosuje kompozycję przyspieszaną przez GPU na wszystkich stronach, a nie tylko na tych, które zawierają warstwy przyspieszane przez GPU.

Rysowanie przyspieszane przez GPU Włącz przyspieszane przez GPU rysowanie zawartości strony, gdy włączone jest komponowanie.

GPU Accelerated Canvas 2D Zapewnia wyższą wydajność tagów kanwy w kontekście 2D dzięki renderowaniu przy użyciu sprzętu GPU (Graphics Processor Unit).

Włączono je, wypróbowałem i nie udało się żałośnie z włączonym polem wyboru (tak jak ty). Ale potem zauważyłem kolejną opcję:

Licznik klatek na sekundę Pokazuje rzeczywistą liczbę klatek na sekundę strony w klatkach na sekundę, gdy akceleracja sprzętowa jest aktywna .

Biorąc pod uwagę wyróżnienie w opisie flagi, spekuluję, że akceleracja sprzętowa była w rzeczywistości włączona dla mnie nawet bez zaznaczonego pola wyboru, ponieważ widziałem licznik FPS z włączonymi powyższymi opcjami!

TL; DR: akceleracja sprzętowa jest ostatecznie preferencją użytkownika; wymuszenie go za pomocą atrapy translateZ(0)wprowadzi zbędne narzuty przetwarzania, dając wrażenie niższej wydajności.


2
Więc spójrz na to. Zrobiłem kolejny test. Zasadniczo to samo, co w teście nr 1, ale tym razem dodatkowo pozwoliłem -webkit-transform: rotateZ(360deg); pudełkom obracać się wokół własnej osi, dodając dl.dropbox.com/u/17844821/zeug/hwtest2.html - Tym razem wersja z akceleracją sprzętową jest szybsza! Jeśli usunę obrót, przyspieszenie sprzętowe spowalnia animację.
Timo

@valmar: czy włączasz licznik fps? W tym nowym przykładzie widzę to niezależnie od tego, jak ustawię pole wyboru, co oznacza, że ​​akceleracja sprzętowa jest nadal wymuszona. Chyba twoje pytanie sprowadza się do „dlaczego jest translateZ(0)wolniejszy niż rotateZ(360deg)
OV

Właściwie nie. translateZ(0)jest ZAWSZE aktywny. W rzeczywistości jest wymagane, aby wyzwolić przyspieszenie 3D. rotateZ(360deg)tylko dodatkowo dodaje animację rotacji. Więc powiedziałbym, że pytanie brzmi: dlaczego animacja z akceleracją sprzętową 3D jest płynniejsza rotateZ(360deg)niż bez?
Timo

1
nie mogę w to uwierzyć. Obracanie ciężkich obrazów jest szybsze bez akceleracji sprzętowej ...
ProblemsOfSumit

0

Sprawdź chrome: // flags w chrome. To mówi

„Gdy włączone jest komponowanie w wątkach, przyspieszone animacje CSS są uruchamiane w wątku kompozycji. Jednak przy przyspieszonych animacjach CSS może wystąpić wzrost wydajności, nawet bez wątku kompozytora”.


Nie mogę znaleźć tej opcji na chrome: // flags tutaj. Jeśli wyłączysz tę funkcję, czy wersja z akceleracją sprzętową jest szybsza od wersji bez akceleracji?
Timo,

Teraz ta opcja jest w ustawieniach DevTools
Dmitry Pashkevich

0

Z mojego doświadczenia wynika, że ​​układy GPU nie są generalnie szybsze dla wszystkich rodzajów grafiki. W przypadku bardzo „podstawowych” grafik mogą być wolniejsze.

Możesz uzyskać inny wynik, obracając obraz - w tym są dobre układy GPU

Weź również pod uwagę, że translateZ (0) jest operacją w trzech wymiarach, podczas gdy zmiana góry lub lewej jest operacją dwuwymiarową


Najprawdopodobniej jest to problem z wdrożeniem. Procesory GPU są znacznie szybsze dla wszystkich grafik, o ile dobrze je zaimplementujesz;)
scientiaesthete

1
translateZ(0)właściwie nie robi nic poza „aktywacją” akceleracji sprzętowej 3D. To hack, ale działa. Podczas dodawania tego atrybutu css, wybrany element html, a także wszystkie elementy podrzędne, zostaną obliczone wymuszenie przez GPU, a nie przez procesor.
Timo,

Nie znam wszystkich szczegółów implementacji niskiego poziomu. Miałem podobne problemy z QT - przyspieszenie sprzętowe spowalniało działanie. Nie wiem, w którym momencie (lub czy) komputer zdaje sobie sprawę, że translateZ (0) można zignorować, a transformację można przetworzyć jako ruch w 2 wymiarach. (Brak perspektywy, brak antyaliasingu, brak z + = 0 na każdy piksel)
sabof

Scientiaesthete, GPU nie jest szybszy w obliczaniu wszystkich elementów graficznych, ponieważ przeniesienie poleceń i pamięci do GPU i pamięci GPU wymaga wysiłku procesora. Istnieje punkt krytyczny złożoności, aby wysiłek ten stał się opłacalny. YMMV <tutaj ręczny optymalizator przed montażem;)
tomByrer

Procesory graficzne są znacznie szybsze w przypadku rzeczywistej części obliczeniowej. Jednak wszystkie obecnie dostępne procesory graficzne mają dość ciężką fazę konfiguracji przed rozpoczęciem rzeczywistych obliczeń. W przypadku „prostych” treści, pozwolenie procesorowi na wykonanie całego renderowania może być szybsze niż konfiguracja GPU + obliczenia GPU. Dobrze zaimplementowana przeglądarka automatycznie dokona właściwego wyboru i nie ma możliwości, aby jakikolwiek autor losowych treści zrobił to lepiej.
Mikko Rantalainen

-2

Widziałem was dwójkę demo , Chyba znam powód, dla którego się zdezorientowaliście :

  1. Elementy animacji Nie używaj lewej ani górnej części do zmiany lokalizacji, spróbuj użyć -webkit-transform;
  2. Wszystkie elementy potomne muszą mieć włączone przyspieszenie sprzętowe, takie jak translateZ () lub translate3D;
  3. FPS mierzy płynność animacji, twój demo FPS średnio tylko 20 FPS.

Powyżej tylko osobista opinia, dziękuję!


Witamy w Stack Overflow! Prosimy nie używać podpisów / sloganów w swoich postach. Twoja skrzynka użytkownika liczy się jako Twój podpis i możesz używać swojego profilu do publikowania dowolnych informacji o sobie. Często zadawane pytania dotyczące podpisów / sloganów
Andrew Barber

3
Wyjaśniłem już dlaczego, a także wspomniano, dlaczego we wpisie FAQ, do którego utworzyłem link. Masz już podpis - spójrz w prawo, gdzie znajduje się Twoje imię i zdjęcie awatara.
Andrew Barber

好吧 , 你 “淫” 了。 不过 还是 很 感谢 , 还 不太 熟悉 „stackoverflow” 的 规则。
一丝 冰凉

1
Zapraszamy. Należy również pamiętać, że jest to witryna wyłącznie w języku angielskim. :) Twoje imię jest w porządku, ale posty powinny być pisane po angielsku.
Andrew Barber

3
苦 逼 了, nie mówię po angielsku, wybacz mi, proszę.
一丝 冰凉
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.