Производительность CSS по сравнению с translateZ(0)

В ряде блогов говорится о приросте производительности за счет «обмана» графического процессора, чтобы он думал, что элемент является трехмерным, с помощью transform: translateZ(0) для ускорения анимации и переходов. Мне было интересно, есть ли последствия для использования этого преобразования следующим образом:

* {
    -webkit-transform: translateZ(0);
    -moz-transform: translateZ(0);
    -ms-transform: translateZ(0);
    -o-transform: translateZ(0);
    transform: translateZ(0);
}

person Ahmed Nuaman    schedule 30.05.2012    source источник
comment
Вы можете дать ссылку на эти статьи в блоге?   -  person Jürgen Paul    schedule 06.10.2013
comment
@PineappleUndertheSea этот: blog.teamtreehouse.com/ отправил меня сюда.   -  person    schedule 14.03.2014
comment
Кстати, -o-transform: translateZ(0) никогда не было чем-то особенным. caniuse.com/#search=translate3d   -  person Volker E.    schedule 03.01.2017
comment
@ Ахмед Нуаман, да, это не только уловка. Но он официально используется в некоторых приложениях. Но если вы окажетесь на устройстве (младшего класса) без графического процессора... Я не уверен, как оно работает. Но поскольку то, что может делать процессор (2D-графика), делегируется графическому процессору только по той причине, что есть 3D-команда, хотя она не имеет окончательного влияния. А 3D использует несколько ядер внутри и работает быстрее. Вот что здесь имеет смысл. Нужно еще расследование...   -  person TooGeeky    schedule 18.07.2017


Ответы (5)


Преобразования CSS создают новый контекст стека и содержащий блок, как описано в спецификации. На английском языке это означает, что элементы с фиксированным положением с примененным к ним преобразованием будут действовать как абсолютно позиционированные элементы, а значения z-index, скорее всего, испортятся.

Если вы посмотрите на эту демонстрацию, вы поймете, что я имею в виду. Ко второму элементу div применено преобразование, означающее, что он создает новый контекст наложения, и псевдоэлементы располагаются сверху, а не снизу.

Так что в принципе, не делайте этого. Применяйте 3D-преобразование только тогда, когда вам нужна оптимизация. -webkit-font-smoothing: antialiased; — это еще один способ использовать 3D-ускорение, не создавая этих проблем, но он работает только в Safari.

person Dan Eden    schedule 30.05.2012

Если вам нужны последствия, в некоторых сценариях Производительность Google Chrome ужасна с включенным аппаратным ускорением. Как ни странно, изменение «трюка» на -webkit-transform: rotateZ(360deg); сработало просто отлично.

Я не верю, что мы когда-либо поняли, почему.

person Oleg    schedule 30.05.2012
comment
У меня были проблемы, такие как сжатые изображения и ужасно неправильная анимация с использованием максимальной высоты в Safari 5 и 6. Когда я отключил ускорение графического процессора (translateZ(0)), все работало как задумано, но анимация была недостаточно плавной. Я изменил translateZ(0) на rotateZ(360deg), и внезапно анимация стала плавной, с аппаратным ускорением, и проблем больше не было. - person jakub_jo; 30.03.2015

Это заставляет браузер использовать аппаратное ускорение для доступа к графическому процессору устройства (GPU), чтобы заставить пиксели летать. Веб-приложения, с другой стороны, работают в контексте браузера, что позволяет программному обеспечению выполнять большую часть (если не все) рендеринга, что приводит к меньшей мощности для переходов. Но Интернет догоняет, и большинство поставщиков браузеров теперь обеспечивают графическое аппаратное ускорение с помощью определенных правил CSS.

Использование -webkit-transform: translate3d(0,0,0); активирует GPU для переходов CSS, делая их более плавными (более высокий FPS).

Примечание. translate3d(0,0,0) не влияет на то, что вы видите. Он перемещает объект на 0 пикселей по осям x, y и z. Это всего лишь метод принудительного аппаратного ускорения.

Полезно прочитать здесь: http://www.smashingmagazine.com/2012/06/21/play-with-hardware-accelerated-css/

person Community    schedule 18.09.2014

Я могу засвидетельствовать тот факт, что -webkit-transform: translate3d(0, 0, 0); будет иметь дело с новым свойством position: -webkit-sticky;. С шаблоном навигации в левом ящике, над которым я работал, аппаратное ускорение, которое я хотел с помощью свойства преобразования, мешало фиксированному расположению моей верхней панели навигации. Я отключил преобразование, и позиционирование работало нормально.

К счастью, у меня, похоже, уже было включено аппаратное ускорение, потому что у меня было -webkit-font-smoothing: antialiased в элементе html. Я тестировал это поведение в iOS7 и Android.

person J. Hogue    schedule 09.05.2014

На мобильных устройствах отправка всего в GPU вызовет перегрузку памяти и сбой приложения. Я столкнулся с этим в приложении для iPad в Кордове. Лучше всего отправлять в GPU только необходимые элементы, те элементы div, которые вы специально перемещаете.

Еще лучше использовать 3D-преобразования transitions для создания анимации, например, translateX(50px), а не left:50px;

person Perry    schedule 10.09.2013
comment
Вы имели в виду использовать 3D-преобразования вместо использования 3D-переходов? - person Isius; 15.11.2013