что делает -webkit-transform: translate3d(0,0,0);
точно?
Имеются ли какие-либо проблемы с производительностью? Должен ли я просто применять его к телу или отдельным элементам? По-видимому, это сильно улучшает события прокрутки.
Спасибо за урок!
что делает -webkit-transform: translate3d(0,0,0);
точно?
Имеются ли какие-либо проблемы с производительностью? Должен ли я просто применять его к телу или отдельным элементам? По-видимому, это сильно улучшает события прокрутки.
Спасибо за урок!
-webkit-transform: translate3d(0,0,0);
заставляет некоторые устройства запускать аппаратное ускорение.
Хорошее чтение найдено Здесь
Собственные приложения могут обращаться к графическому процессору устройств (GPU), чтобы заставить пиксели летать. С другой стороны, веб-приложения работают в контекст браузера, который позволяет программе делать больше всего (если не все) рендеринга, что приводит к меньшей мощности для переходов. Но Интернет догоняет, и большинство поставщиков браузеров теперь предоставляют графическое аппаратное ускорение с помощью определенных правил CSS.
Использование -webkit-transform: translate3d(0,0,0);
приведет к тому, что GPU вступит в действие для переходов CSS, делая их более плавными (более высокий FPS).
Примечание: translate3d(0,0,0)
ничего не делает с точки зрения того, что вы видите. он перемещает объект на 0px по оси x, y и z. Это всего лишь способ принудительного аппаратного ускорения.
Альтернативой является -webkit-transform: translateZ(0)
. И если в Chrome и Safari мерцают из-за преобразований, попробуйте -webkit-backface-visibility: hidden
и -webkit-perspective: 1000
. Для получения дополнительной информации см. в этой статье.
Я не видел здесь ответа, который объясняет это. Множество преобразований может быть выполнено путем вычисления каждого из div
и его параметров с помощью сложного набора валидации. Однако, если вы используете 3D-функцию, каждый из 2D-элементов, которые у вас есть, рассматриваются как 3D-элементы, и мы можем выполнять преобразование матрицы на этих элементах "на лету". Однако большинство элементов "технически" уже аппаратно ускорены, потому что все они используют графический процессор. Но 3D-преобразования работают непосредственно на кэшированных версиях каждого из этих 2D-рендерингов (или кешированных версий div
) и непосредственно используют преобразование матрицы на них (которые являются векторизованной и параллельной математикой FP).
Важно отметить, что 3D-преобразования ТОЛЬКО вносят изменения в функции на кэшированном 2D-div (другими словами, div уже является визуализированным изображением). Таким образом, вещи, такие как изменение ширины и цвета границы, больше не являются "3D", чтобы смутно говорить. Если вы думаете об этом, изменение ширины границ требует, чтобы вы перезагрузили div
, потому что и recache, чтобы 3D-преобразования могли применяться.
Надеюсь, что это имеет смысл и дайте мне знать, если у вас есть еще вопросы.
Чтобы ответить на ваш вопрос, translate3d: 0x 0y 0z
ничего не сделает, поскольку преобразования напрямую работают с текстурой, которая формируется путем запуска вершин div
в шейдер графического процессора. Этот шейдерный ресурс теперь кэшируется, и матрица будет применяться при рисовании на буфер кадра. Таким образом, в принципе нет никакой пользы от этого.
Так работает браузер внутри.
Шаг 1: Вход для анализа
<div style = "position:absolute;left:0;right:0;bottom:0;top:0;"></div>
Шаг 2. Разработка композитного слоя
CompositeLayer compLayer = new CompositeLayer();
compLayer.setPosition(0, 0, 0, 0);
compLayer.setPositioning(ABSOLUTE); // Note. this is psuedocode. The actual code
Pipeline.add(compLayer, zIndex); // would be significantly more complex.
Шаг 3: Создание композитного слоя
for (CompositeLayer compLayer : allCompositeLayers){
// Create and set cacheTexture as active target
Texture2D cacheTexture = new Texture2D();
cacheTexture.setActive();
// Draw to cachedTexture
Pipeline.renderVertices(compLayer.getVertices());
Pipeline.setTexture(compLayer.getBackground());
Pipeline.drawIndexed(compLayer.getVertexCount());
// Set the framebuffer as active target
frameBuffer.setActive();
// Render to framebuffer from texture and **applying transformMatrix**
Pipeline.renderFromCache(cacheTexture, transformMatrix);
}
Там есть ошибка с прокруткой в MobileSafary (iOS 5), которая приводит к появлению артефактов как копий входных элементов в контейнере прокрутки.
Использование translate3d для каждого дочернего элемента может исправить эту нечетную ошибку. Вот пример CSS, который сохранил мне день.
.scrolling-container {
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.scrolling-container .child-element {
position: relative;
-webkit-transform: translate3d(0,0,0);
}
Translate3D заставляет аппаратное ускорение.CSS анимации, преобразования и переходы не автоматически ускоряются GPU, а вместо этого выполняют из браузера медленный механизм рендеринга программного обеспечения. Для использования GPU мы используем translate3d
В настоящее время браузеры, такие как Chrome, FireFox, Safari, IE9 + и новейшая версия Opera, имеют аппаратное ускорение, они используют его только тогда, когда у них есть указание на то, что элемент DOM выиграет от него.
Помните, что он создает стековый контекст (плюс то, что другие ответы говорят), так что это потенциально может повлиять на то, что вы см., например что-то появляется над наложением, если оно не предполагается.