移动端 像素渲染流水线与GPU hack

什么是 像素渲染流水线

web页面你所写的页面代码是如何被转换成屏幕上显示的像素的。这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤;

1.JavaScript:一般来说,我们会使用JavaScript来实现一些视觉变化的效果。比如用jQuery的animate函数做一个动画、对一个数据集进行排序、或者往页面里添加一些DOM元素等。

当然,除了JavaScript,还有其他一些常用方法也可以实现视觉变化效果,比如:CSS Animations, Transitions和Web Animation API。

2.计算样式:这个过程是根据CSS选择器,比如.headline或.nav > .nav_item,对每个DOM元素匹配对应的CSS样式。这一步结束之后,就确定了每个DOM元素上该应用什么CSS样式规

3.布局:  上一步确定了每个DOM元素的样式规则,这一步就是具体计算每个DOM元素最终在屏幕上显示的大小和位置。web页面中元素的布局是相对的,因此一个元素的布局发生变化,会联动地引发其他元素的布局发生变化。比如,<body>元素的宽度的变化会影响其子元素的宽度,其子元素宽度的变化也会继续对其孙子元素产生影响。因此对于浏览器来说,布局过程是经常发生的。

4.绘制:  本质上就是填充像素的过程。包括绘制文字、颜色、图像、边框和阴影等,也就是一个DOM元素所有的可视效果。一般来说,这个绘制过程是在多个层上完成的。

5.渲染层合并:由上一步可知,对页面中DOM元素的绘制是在多个层上进行的。在每个层上完成绘制过程之后,浏览器会将所有层按照合理的顺序合并成一个图层,然后显示在屏幕上。对于有位置重叠的元素的页面,这个过程尤其重要,因为一旦图层的合并顺序出错,将会导致元素显示异常。

虽然在理论上,页面的每一帧都是经过上述的流水线处理之后渲染出来的,但并不意味着页面每一帧的渲染都需要经过上述五个步骤的处理。实际上,对视觉变化效果的一个帧的渲染,有这么三种 常用的 流水线:

1. JS / CSS > 计算样式 > 布局 > 绘制 > 渲染层合并

如果你修改一个DOM元素的”layout”属性,也就是改变了元素的样式(比如宽度、高度或者位置等),那么浏览器会检查哪些元素需要重新布局,然后对页面激发一个reflow过程完成重新布局。被reflow的元素,接下来也会激发绘制过程,最后激发渲染层合并过程,生成最后的画面。

2. JS / CSS > 计算样式 > 绘制 > 渲染层合并

如果你修改一个DOM元素的“paint only”属性,比如背景图片、文字颜色或阴影等,这些属性不会影响页面的布局,因此浏览器会在完成样式计算之后,跳过布局过程,只做绘制和渲染层合并过程。

3. JS / CSS > 计算样式 > 渲染层合并

如果你修改一个非样式且非绘制的CSS属性,那么浏览器会在完成样式计算之后,跳过布局和绘制的过程,直接做渲染层合并。

第三种方式在性能上是最理想的,对于动画和滚动这种负荷很重的渲染,我们要争取使用第三种渲染流程(充分合理 利用 GPU hack)

下面我们先看个gif例子;4个dom元素运动;

第1个 left的,单纯left运动

第2个 left的,left+gpu运动

第3个 left的,单纯translateX运动

第3个 left的,单纯translate3d运动(自动缓存GPU)

绿色部分表示dom 元素在运动时候,元素dom位置发生改变,促发了回流, (回流(也叫重排reflows)必将引起重绘(repaints),而重绘不一定会引起回流。)

回流何时发生:

当页面布局和几何属性改变时就需要回流。下述情况会发生浏览器回流:

1、添加或者删除可见的DOM元素;

2、元素位置改变;

3、元素尺寸改变——边距、填充、边框、宽度和高度

4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;

5、页面渲染初始化;

6、浏览器窗口尺寸改变——resize事件发生时;

开启 一般这样可以了

.GPU{ -webkit-transform:translateZ(0);transform:translateZ(0);backface-visibility:hidden; }

下面的css属性也可以的 都能开启GPU加速;

-webkit-transform: translate3d(0,0,0);
-webkit-transform:translate3D(0,0,0); //大写3D

-webkit-transform: translateZ(0);
-webkit-backface-visibility:hidden;
-webkit-transform: scaleZ(0) ;
-webkit-transform: rotateX(0);
-webkit-transform: rotateY(0);
-webkit-transform: rotateZ(0) ;
-webkit-transform:  scale3d(0,0,0) ;
-webkit-transform: rotate3d(0,0,0,0);

GPU hcak 缓存到渲染层;常用的环境 适当利用

1.含有 fixed 元素

2.含有 动画的元素

3.含有 -webkit-overflow-scrolling: touch;

页面中 transform()js 函数 代码

参考与推荐:

html5rocks

google 开发者

腾讯舜子 16.6毫秒的优化 虽然是2013年的,还是很值得借鉴的和细细品读的

阿里 hugohua 和荔枝 写的 移动端性能调优

时间: 2024-10-06 10:49:46

移动端 像素渲染流水线与GPU hack的相关文章

Unity3D Shader之路 写Shader前必须要知道的事情 渲染流水线的概括

版本:unity 5.4.1  语言:Unity Shader 总起: 最近花了一个月的时间把<Unity Shader 入门精要>看完了,没怎么写博文,因为写得太好了,看得有点废寝忘食了,再次强烈推荐. 今天把写Shader前必须要知道的渲染流水线给概括一下,然后简单结合顶点\片元着色器Shader,说说各个代码在流水线的位置,以及职责功能. 渲染流水线: 在写Unity脚本的时候,不管是C#也好还是js也好,都是在跟CPU打交道,做算术运算.调用类成员.控制程序流程.而写Shader不同,

渲染流水线

渲染流水线最终目的:生成或者渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果.它的输入是一个虚拟摄像机.一些光源.一些shader以及纹理等. 渲染流程分为三个阶段:应用阶段,几何阶段,光栅化阶段. 应用阶段: 通常由CPU负责实现.是由开发者主导的. 开发者有3个主要任务: 准好场景数据.例如摄像机的位置.视椎体.场景里的模型.光源等. 做一个粗粒度剔除工作.把那些不可见的物体剔除出去,这样就不需要再移交给几何阶段. 设置好每个模型的渲染状态.包括但不限于使用的材质(漫反射颜色.高光反射颜色

第一章 渲染流水线

1 综述 好吧,既然是从最基础开始说起,那我们就有必要了解什么是Shader,即着色器.与之关系非常紧密的就是渲染流水线.可以说如果不了解渲染流水线的工作流程,就无法说自己真正的了解Shader. 1.1 什么是流水线 要想学会怎么使用Shader,我们首先要了解Shader是怎么工作的.实际上,Shader仅仅是渲染流水线的一个环节,想要让我们的Shader发挥出它的作用,我们就需要知道它在流水中扮演了怎样的角色. 理想情况下,如果把一个非流水线系统分成n个流水线阶段,并且每个阶段耗费时间相同

一篇文章搞懂到底什么是渲染流水线

本文实际上是<Unity Shader入门精要>一书的读书笔记,书中关于渲染流水线的讲解清楚易懂,非常适合作为Shader学习的入门书籍.自知好记性不如烂笔头,遂将相关内容再结合自己的一些理解写作这篇博客记录下来. 我们将图像绘制的流程称为渲染流水线,是由CPU和GPU协作完成的.一般一个渲染流程可以分成3个概念阶段,分别是:应用阶段(Application Stage),几何阶段(Geometry Stage),光栅化阶段(Rasterizer Stage). 应用阶段 应用阶段是在CPU中

服务端预渲染之Nuxt(介绍篇)

现在前端开发一般都是前后端分离,mvvm和mvc的开发框架,如Angular.React和Vue等,虽然写框架能够使我们快速的完成开发,但是由于前后台分离,给项目SEO带来很大的不便,搜索引擎在检索的时候是在网页中爬取数据,由于单页面应用读取到的页面是几乎空白的,无法爬取到任何数据信息. <!DOCTYPE html> <html> <head> <meta charset=utf-8> <meta name=viewport content=&quo

GPU渲染流水线的简单概括

GPU流水线 主要分为两个阶段:几何阶段和光栅化阶段 几何阶段 顶点着色器 --> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪-->屏幕映射  顶点着色器 流水线的第一个阶段,输入来自于CPU,处理的基本单位为单个顶点,输入的每个顶点都会调用一次顶点着色器. 主要工作是:坐标变换(比如改变顶点位置模拟水面.布料等)和逐顶点光照,并输出后续阶段需要的数据(常见的输出路径是经光栅化后交给片元着色器处理). 曲面着色器 一个可选的着色器,用于细分图元. 几何着色

「UnityShader入门精要」第二章 渲染流水线

2.3 GPU流水线 2.3.2 顶点着色器 输入来自于CPU,处理顶点数据.输入的每个顶点都会调用一次顶点着色器,所以每次都是对单个顶点进行运算. 主要任务:坐标变换.逐顶点光照. 坐标变换:修改顶点的位置,例如模拟水面波纹效果.果冻效果等. 必须完成的工作,把顶点坐标从模型空间转换到齐次裁剪空间. 常见的如:o.pos = mul(UNITY_MVP, v.position); 2.3.3 裁剪 摄像机视野有限,视野外的物体不需要被处理,可以直接裁剪掉. 2.3.4 屏幕映射 将单位立方体内

跨平台渲染框架尝试 - GPU Buffer的管理(1)

buffer资源 下面来谈谈buffer的管理.buffer资源从广义上就是C语言的数组.如下图所示. 图 buffer的广义模型 在渲染管线中,无论是opengl还是dx或者其他的渲染api,都会提供下列的buffer类型.vertex buffer,index buffer,constant buffer,structured buffer,raw buffer与indirect arguments buffer.  这些buffer的不同就在于两个方面. 首先就是内存结构.有流式的buff

UnityShader入门精要-第二章 渲染流水线笔记

渲染流程包括:应用阶段.几何阶段和光栅化阶段. 1.应用阶段 应用阶段是由我们的应用主导的,通常由CPU负责. 在这一阶段开发者有三个主要任务 首先 需要准备好场景的数据. 其次  为了提高渲染的性能,我们往往要做一个粗粒度剔除,把那些看不见的物体剔除出去,这样就不需要交给几何阶段去处理. 最后需要设置好每个模型的渲染状态.这些渲染状态包括但不仅限于它使用的材质(漫反射的颜色.高光反射的颜色).使用的纹理.使用的shader等.这一阶段最重要的是输出渲染所需要的几何信息,即渲染图元.渲染图元可以