大部分情况下,都是GPU来干这个活儿,因为GPU真的特别快!!!
怎么画
所谓的“画”,对于计算机来讲就是处理图像,其实就是根据需要(就是DisplayList中的命令)对数据做一些特定类型的数学运算,最后输出结果的过程。我们看到的每一帧精美界面,(几乎)都是GPU吭哧吭哧"算"出来的,这个就有疑问了:
既然是运算,CPU也能算啊,为什么GPU更快呢?
我们简单地聊聊CPU与GPU的区别: CPU的核心数通常是几个,单个核心的主频高,功能强大,擅长串行处理复杂的流程; GPU (Graphics Processing Unit) 有成百上千个核心,单个核心主频低,功能有限,擅长(利用超多核心)大量并行简单运算;正如它的名字一样,GPU就是为图像绘制这个场景量身定做的硬件(所以使用GPU也叫硬件加速),后来也被用到挖矿和神经网络中。
图片肯定没有视频直观,我们从感性的角度感受一下GPU到底有多快,我想下面的视频看过就不会忘掉,你会被GPU折服: Mythbusters Demo GPU versus CPU
看这个视频,我们对于“加速”应该有了更深刻的印象,这里不再进一步分析CPU和GPU更微观的差别(因为不懂),我想已经讲明白为什们GPU更快了。
另外,在GPU开始绘制之前,系统也做了一些优化(对DisplayList中的命令进行预处理),让整个绘制流程更加高效:
- 增量更新:两帧图像之间只是个别View改变了,那么只绘制更新的View即可,实现方案是
DisplayList
的Damaged Area
- 指令重排序(reordering)、指令合并(merging)、批处理(batching)
在硬件绘制之前,第一步中输出的信息会转化成 OpenGL ES
中对应的绘制命令( gl commands
),这些命令原本是按照View树的层级关系来递归输出的。可这些命令中有很多(看起来)相同的操作,比如我们在绘制一个列表时,同样属性的文字(标题,内容,昵称等)要绘制十几次,这时候如果把绘制命令重新排序、进行一定的合并和批处理,性能会提升很多。如下图:
+ 未经优化, 按顺序绘制
- 优化后,一次绘制出所有的文字
第二步的具体过程还是很复杂的,比如涉及到Alpha绘制,相关的优化会失效,详情查看文章为什么alpha渲染性能低.
画在哪里
至于画在哪里,我们现在理解为一个缓冲(Buffer)中就可以了,具体的机制放在第三步讲。
到此,我们已经画(绘制)完了图像内容,把这个内容发送出去,第二步的任务就完成了。
Tip:
在Android L 之前,第二步的操作在应用进程的UI Thread中执行;
在Android L 之后, 第二步的操作在应用进程的RenderThread中执行。
3. 显示到屏幕
我们知道&