Почему включение аппаратного ускорения в 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.
Я сделал тест на своем примере и, насколько я могу судить, это работает.
что касается "почему" часть вашего вопроса... Я не знаю. 3D transform-это молодой стандарт, поэтому реализация изменчива. Вот почему это свойство с префиксом: для бета-тестирования. Кто-то может заполнить отчет об ошибке или вопрос и у команды расследования.
редактировать за 19 августа 2013:
есть регулярная активность по этому ответу, и я только что потерял час, обнаружив, что IE10 также нуждается в этом. Так что не забывайте :
backface-visibility: hidden; perspective: 1000;
причина анимации была медленнее, когда вы добавили null transform hack (
translateZ(0)
) заключается в том, что каждое нулевое 3D-преобразование создает новый слой. Когда этих слоев слишком много, производительность рендеринга страдает, потому что браузеру нужно отправить много текстур на GPU.проблема была замечена в 2013 году на домашней странице Apple, которая злоупотребляла нулевым преобразованием hack. Видеть http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/
ОП также правильно заметил объяснение в комментариев:
перемещение нескольких больших объектов более эффективно, чем перемещение большого количества мелких объектов при использовании 3D-ускорения, потому что все 3D-ускоренные слои должны быть перенесены на графический процессор и обратно. Так что даже если GPU делает хорошую работу, передача многих объектов может быть проблемой, так что использование ускорения GPU может не стоить того.
интересные. Я пробовал играть с несколькими вариантами в
about:flags
, а конкретно вот эти:GPU композитинг на всех страницах использует GPU-ускоренное композитирование на всех страницы, а не только те, которые включают слои с ускорением GPU.
графический процессор ускоренного рисования включить аппаратное ускорение отрисовки страницы содержимое, когда композитинг включен.
GPU ускоренный холст 2D обеспечивает более высокую производительность тегов холста с 2D-контекстом путем рендеринга с использованием графического процессора (GPU) аппаратура.
включил их, попробовал и потерпел неудачу с включенной галочкой (так же, как и вы). Но тут я заметил еще один вариант:
счетчик FPS показывает фактическую частоту кадров страницы, в кадрах в секунду, при активном аппаратном ускорении.
учитывая выделение в флаге описание, я бы предположил, что аппаратное ускорение было, по сути, включено для меня даже без отмеченного флажка, так как я видел счетчик FPS с включенными выше параметрами!
TL; DR: аппаратное ускорение, в конце концов, предпочтения пользователя, заставив его с манекена
translateZ(0)
введет избыточные накладные расходы на обработку, что приведет к снижению производительности.
Проверьте chrome: / / флаги в chrome. Там написано
" при включении потоковой компоновки ускоренные анимации CSS запускаются в потоке компоновки. Тем не менее, может быть прирост производительности, работающий с ускоренной анимацией CSS, даже без потока компоновщика."
мой опыт заключается в том, что графические процессоры обычно не быстрее для всех видов графики. Для очень "базовой" графики они могут быть медленнее.
вы могли бы получить другой результат, если бы вы вращали изображение - это то, что графические процессоры хороши
также учтите, что translateZ(0) - это операция в 3-х измерениях, а изменение сверху или слева-это 2-х мерная операция
Я видел вас двоих демо, я думаю, я знаю, почему вы путаете:
- элементы анимации не используют левый или верхний, чтобы изменить местоположение, попробуйте использовать-webkit-transform;
- все дочерние элементы должны включать аппаратное ускорение, такое как использование translateZ () или translate3D;
- измерить ФПС плавность анимации, демо ФПС в среднем 20фпс.
выше, только личное мнение, спасибо!