Чому увімкнення апаратного прискорення в CSS3 уповільнює продуктивність?


82

Я переміщую 6000 маленьких елементів div в експерименті css3, використовуючи перехід від top: 0до top: 145pxдо тестової продуктивності.

Без використання апаратного прискорення в Google Chrome працює гладко.

Якщо я ввімкну апаратне прискорення за допомогою translateZ(0)продуктивності, це стає жахливо.

Чому це так?

Ось мій приклад коду: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


Оновлення (13.11.2014): Оскільки це питання все ще привертає увагу, я хотів би зазначити, що сама проблема все ще існує, хоча згадане заїкання може бути вже не видно у наданій демонстрації на сучасному обладнанні . Старі пристрої все ще можуть бачити проблеми з продуктивністю.


9
Справжнє питання полягає в тому, чому деякі браузери хочуть, щоб автори вдавалися до безглуздих хаків, таких як "нульові" перетворення, щоб активувати апаратне прискорення. Firefox відкладає на графічний процесор якомога більше, тоді як IE вирішує прискорити _ ВСІ_ РЕЧІ! Але цікаве питання тут, тим не менш, оскільки це, здається, демонструє, що подібні хакі можуть навіть дати зворотний ефект.
BoltClock

2
@ BoltClock'saUnicorn В основному я з вами згоден. Але чи не завжди так було з проблемами між браузерами? :-)
Тимо

6
Я задав це запитання досить давно, але зараз помітив, що кількість переміщених елементів, здається, сильно впливає на проблему. Переміщення кількох великих об'єктів є більш продуктивним, ніж переміщення великої кількості дрібних предметів при використанні 3D-прискорення, оскільки всі шари, прискорені 3D, повинні бути перенесені на графічний процесор і шлях назад. Отже, навіть якщо графічний процесор робить хорошу роботу, передача багатьох об’єктів може бути проблемою, так що використання прискорення графічного процесора може не коштувати того.
Тимо

1
Я не бачу різниці в продуктивності в прикладі в жодному браузері і проголосував за закриття, оскільки це більше не відтворюється.
Jason C

1
@Timo Щойно перевірив, які найновіші версії Firefox і Chrome, а також IE11, 64-розрядну Windows 7, досить старий 2,3 ГГц i5 Thinkpad з nVidia 4200M, обидва варіанти здаються мені плавними. знизати плечима
Джейсон С

Відповіді:


100

Я завжди додаю:

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

При роботі з 3D-перетворенням. Навіть "фальшиві" 3D-перетворення. Досвід підказує, що ці два рядки завжди покращують продуктивність, особливо на iPad, а також на Chrome.

Я протестував на вашому прикладі, і, наскільки я можу зрозуміти, це працює.

Щодо частини вашого запитання "чому" ... я не знаю. 3D-перетворення є молодим стандартом, тому реалізація нестабільна. Ось чому це префіксована властивість: для бета-тестування. Хтось може заповнити звіт про помилку або запитання і попросити команду провести розслідування.

Редагувати за 19 серпня 2013 року :

З цією відповіддю регулярно проводяться заняття, і я просто втратив годину, переконавшись, що IE10 також це потрібно. Тож не забувайте:

backface-visibility: hidden;
perspective: 1000;

3
Я зробив ще один тест. В основному те саме, що і тест №1, але цього разу я дозволив коробкам також обертатися навколо осі z через -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html - Цього разу апаратно прискорена версія швидша! Якщо я прибираю обертання, апаратне прискорення сповільнює анімацію. Якщо ваша теорія відповідає дійсності, то це не повинно працювати (бо єдина різниця полягає в тому, що я додав rotateZ(360)). З іншого боку, можливо, хром досить розумний, щоб усвідомити, що для обертання навколо осі Z не потрібно перекроювати задню частину цих плиток?
Тимо

1
Це вже не так у iOS6 :-(
Michael Mullany

2
@Timo Просто зверніть увагу, w3schools не пов'язаний з w3c: w3fools.com
Кайл Робінсон Янг

7
ви повинні додати, куди додати ці рядки, а не просто загальне "просто додайте це ..", я сам знаю, де, але багато хто не хотів би.
vsync

4
Додайте його до батьківського елемента, який ви анімуєте.
mddw

7

Причиною того, що анімація була повільнішою, коли ви додали нульове перетворення hack ( translateZ(0)), є те, що кожне нульове 3D-перетворення створює новий шар. Коли цих шарів занадто багато, продуктивність візуалізації страждає, оскільки браузеру потрібно надіслати багато текстур на графічний процесор.

Проблема була помічена в 2013 році на домашній сторінці Apple, яка зловживала хакером нульової трансформації. Див. Http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/

Оператор також правильно помітив пояснення у своєму коментарі :

Переміщення кількох великих об'єктів є більш продуктивним, ніж переміщення великої кількості дрібних предметів при використанні 3D-прискорення, оскільки всі шари, прискорені 3D, повинні бути перенесені на графічний процесор і шлях назад. Отже, навіть якщо графічний процесор робить хорошу роботу, передача багатьох об’єктів може бути проблемою, так що використання прискорення графічного процесора може не коштувати того.


6

Цікаво. Я спробував пограти з кількома варіантами about:flags, зокрема такими:

Композитування GPU на всіх сторінках Використовує GPU-прискорене компонування на всіх сторінках, а не лише на тих, що включають прискорені GPU шари.

GPU Accelerated Drawing Увімкніть GPU прискорене малювання вмісту сторінки, коли увімкнено компонування.

GPU Accelerated Canvas 2D Уможливлює більш високу продуктивність тегів полотна у 2D-контексті завдяки отрисуванню за допомогою апаратного забезпечення графічного процесора (GPU).

Увімкнув ті, спробував і невдало провалився з увімкненою галочкою (так само, як і ти). Але тоді я помітив ще один варіант:

Лічильник кадрів в секунду Показує фактичну частоту кадрів сторінки в кадрах на секунду, коли активно апаратне прискорення .

Беручи до уваги основний момент в описі прапора, я припускаю, що апаратне прискорення насправді було включене для мене навіть без позначеного прапорця, оскільки я побачив лічильник FPS з увімкненими вище опціями!

TL; DR: апаратне прискорення, зрештою, є перевагою користувача; примусове використання манекена translateZ(0)призведе до надмірних накладних витрат на обробку, що дасть вигляд меншої продуктивності.


2
Ну, тоді перевірте це. Я зробив ще один тест. В основному те саме, що і тест №1, але цього разу я додатково дозволив поворотам ящиків обертатись навколо власної осі, додавши -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html - Цього разу апаратно прискорена версія швидша! Якщо я прибираю обертання, апаратне прискорення сповільнює анімацію.
Тимо

@valmar: ти вмикаєш лічильник кадрів у секунду? У цьому новому прикладі я бачу це незалежно від того, як я встановив прапорець, що означає, що апаратне прискорення все ще примусово. Я думаю, ваше запитання зводиться до "чому translateZ(0)повільніше, ніж rotateZ(360deg)"
ov

Насправді ні. translateZ(0)ЗАВЖДИ активний. Це насправді потрібно для запуску прискорення 3d. rotateZ(360deg)просто додатково додає анімацію обертання. Тож я б сказав, що запитання: чому анімація з апаратним прискоренням 3D плавніша, rotateZ(360deg)ніж без?
Тимо

1
не можу повірити. Обертання важких зображень відбувається швидше без апаратного прискорення ...
ProblemsOfSumit

0

Перевірте chrome: // прапори в chrome. Він говорить

"Коли ввімкнено різьбове композитування, прискорені анімації CSS працюють на потоці композитування. Однак, може бути прискорення продуктивності, що працює з прискореними анімаціями CSS, навіть без потоку композитора."


Я не можу знайти цю опцію на chrome: // flags тут. Якщо ви вимкнете цю функцію, чи апаратно прискорена версія швидше, ніж неприскорена версія для вас?
Тимо

Зараз ця опція є в налаштуваннях DevTools
Дмитро Пашкевич

0

Мій досвід полягає в тому, що графічні процесори, як правило, не швидші для всіх видів графіки. Для дуже "базової" графіки вони можуть бути повільнішими.

Можливо, ви отримали інший результат, якби обертали зображення - це те, у чому хороші графічні процесори

Також враховуйте, що translateZ (0) - це тривимірна операція, тоді як зміна верхньої чи лівої - це двовимірна операція


Швидше за все це проблема реалізації. Графічні процесори набагато швидші для будь-якої графіки, якщо ви правильно їх реалізуєте;)
scientiaesthete

1
translateZ(0)насправді не робить нічого, крім як «активувати» апаратне прискорення 3D. Це хак, але він працює. Додаючи цей атрибут css, вибраний елемент html, а також усі дочірні елементи будуть отримувати силу, обчислену GPU, а не CPU.
Тимо,

Я не знаю всіх деталей реалізації на низькому рівні. У мене були подібні проблеми з QT - апаратне прискорення уповільнює ситуацію. Я не знаю, в який момент (і чи) комп’ютер розуміє, що translateZ (0) можна проігнорувати, і перетворення можна обробити як переміщення у двох вимірах. (Без перспективи, без згладжування, без z + = 0 для кожного пікселя)
sabof

scientiaesthete, графічний процесор не швидше робить математику для всієї графіки, оскільки для переміщення команд і пам'яті до графічної та графічної пам’яті потрібні зусилля процесора. Існує надзвичайна точка складності, щоб ці зусилля стали вартими часу. YMMV <ручний оптимізатор попередньої збірки тут;)
tomByrer

Графічні процесори набагато швидші для фактичної частини обчислень. Однак усі доступні на даний момент графічні процесори мають досить важку фазу налаштування перед тим, як почнеться фактичне обчислення. Для "простого" вмісту дозволяти центральному процесору робити всі обробки може бути швидше, ніж налаштування графічного процесора + обчислення графічного процесора. Добре реалізований браузер автоматично зробить правильний вибір, і жоден випадковий автор вмісту не може зробити це краще.
Мікко Ранталайнен

-2

Я бачив вас двох демо-версій , Думаю, я знаю причину, з якої ви заплутали:

  1. Елементи анімації Не використовуйте лівий або верхній для зміни місця розташування, спробуйте використати -webkit-transform;
  2. Усі дочірні елементи повинні вмикати апаратне прискорення, наприклад використання translateZ () або translate3D;
  3. FPS вимірює плавність анімації, ваша демонстраційна FPS в середньому становить лише 20 FPS.

Вище, лише особиста думка, дякую!


Ласкаво просимо до Stack Overflow! Будь ласка, не використовуйте підписи / слогани у своїх публікаціях. Ваше поле користувача вважається вашим підписом, і ви можете використовувати свій профіль, щоб розміщувати будь-яку інформацію про себе, яка вам подобається. Поширені запитання щодо підписів / підписів
Andrew Barber

3
Я вже пояснював, чому, а також згадується, чому в запитанні FAQ, на яке я посилався. У вас вже є підпис - подивіться праворуч, де на ньому буде показано ваше ім’я та зображення аватара.
Ендрю Барбер

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

1
Будь ласка. Зверніть також увагу, що це веб-сайт, який складається лише з англійської мови. :) Ваше ім'я добре, але, будь ласка, ваші публікації мають бути зроблені англійською мовою.
Andrew Barber

3
苦 逼 了, я не розмовляю англійською мовою, будь ласка, прости мене.
一丝 冰凉
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.