Почему включение аппаратного ускорения в CSS3 замедляет производительность?
я перемещаю 6000 небольших элементов div в эксперименте css3, используя переход от top: 0
до top: 145px
для тестирования производительности.
используя нет аппаратное ускорение работает гладко на Google Chrome.
Если я включу аппаратное ускорение через translateZ(0)
производительность будет ужасной.
почему это так?
вот мой пример кода: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html
обновление (2014-11-13): поскольку этот вопрос по-прежнему привлекает внимание, я хотел бы отметить, что сама проблема все еще существует, хотя упомянутое заикание может быть больше не видно в предоставленной демонстрации на современном оборудовании. Старые устройства могут по-прежнему видеть проблемы с производительностью.
6 ответов
Я всегда добавляю :
-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;
при работе с 3d-преобразованием. Даже "поддельные" 3D-преобразования. Опыт говорит мне, что эти две линии всегда улучшают производительность, особенно на iPad, но и на Chrome.
Я сделал тест на вашем exemple и, насколько я могу судить, он работает.
Что касается части" почему " вашего вопроса... Я не знаю. 3D transform-это молодой стандарт, поэтому реализация является изменчивой. Вот почему это свойство с префиксом: для бета-тестирования. Кто-то может заполнить отчет об ошибке или вопрос и команда расследует.
редактировать в августе 19th 2013:
в этом ответе есть регулярная активность, и я только что потерял час, обнаружив, что IE10 также нуждается в этом. Так что не забывайте :
backface-visibility: hidden;
perspective: 1000;
анимация причины была медленнее, когда вы добавили null transform hack (translateZ(0)
) заключается в том, что каждое нулевое 3D-преобразование создает новый слой. Когда слишком много этих слоев, производительность рендеринга страдает, потому что браузеру нужно отправить много текстур на GPU.
проблема была замечена в 2013 году на главной странице Apple, которая злоупотребляла нулевым преобразованием. Видеть http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/
OP также правильно заметил объяснение в комментариев:
перемещение нескольких больших объектов более эффективно, чем перемещение множества мелких элементов при использовании 3D-ускорения, потому что все 3D-ускоренные слои должны быть перенесены на GPU и обратно. Поэтому, даже если GPU делает хорошую работу, передача многих объектов может быть проблемой, так что использование ускорения GPU может не стоить того.
интересные. Я пробовал играть с несколькими вариантами в about:flags
, в частности эти:
GPU композитинг на всех страницах использует GPU-ускоренную композицию на всех страницы, а не только те, которые включают GPU-ускоренные слои.
GPU ускоренного рисования включить GPU ускоренного рисования страницы содержимое при включении компоновки.
GPU ускоренный холст 2D обеспечивает более высокую производительность тегов canvas с 2D-контекстом путем рендеринга с использованием графического процессора (GPU) аппаратура.
включил их, попробовал и потерпел неудачу с включенным флажком (так же, как и вы). Но тут я заметил еще один вариант:--3-->
счетчик FPS показывает фактическую частоту кадров страницы, в кадрах в секунду, при активном аппаратном ускорении.
учитывая выделение в флаге описание, я бы предположил, что аппаратное ускорение было, на самом деле, для меня даже без галочки, так как я видел счетчик FPS с включенными выше параметрами!
TL; DR: аппаратное ускорение, в конце концов, предпочтения пользователя, заставив его с манекена translateZ(0)
введет избыточные накладные расходы на обработку, дающие вид более низкой производительности.
Проверьте chrome: / / флаги в chrome. Тут написано
" при включении резьбовой компоновки ускоренные анимации CSS запускаются в резьбе компоновки. Тем не менее, может быть прирост производительности, работающий с ускоренной анимацией CSS, даже без потока compositor."
мой опыт заключается в том, что графические процессоры обычно не быстрее для всех видов графики. Для очень "базовой" графики они могут быть медленнее.
вы могли бы получить другой результат, если бы вы вращали изображение - это то, что графические процессоры хороши в
также учтите, что translateZ (0) - это операция в 3 измерениях, в то время как изменение сверху или слева-это 2-мерная операция
Я видел Вас двух демо, я думаю, я знаю, почему вы путаете:
- элементы анимации не используют левый или верхний, чтобы изменить местоположение, попробуйте использовать-webkit-transform;
- все дочерние элементы должны включать аппаратное ускорение, например, использовать translateZ () или translate3D;
- FPS измеряют беглость анимации, ваш демонстрационный FPS в среднем только 20FPS.
выше, только личное мнение, спасибо!