「Android渲染」图像是怎样显示到屏幕上的?_android是怎么将canvas中的图案显示在桌面上的

本文探讨了Android系统中图像如何由GPU进行渲染并显示到屏幕,包括GPU在渲染过程中的优势、DisplayList的优化、BufferQueue和SurfaceFlinger的作用,以及Android渲染的演进历史。通过理解这些概念,有助于深入了解Android系统的图形处理机制。
摘要由CSDN通过智能技术生成

大部分情况下,都是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即可,实现方案是DisplayListDamaged Area
  • 指令重排序(reordering)、指令合并(merging)、批处理(batching)

在硬件绘制之前,第一步中输出的信息会转化成 OpenGL ES中对应的绘制命令( gl commands ),这些命令原本是按照View树的层级关系来递归输出的。可这些命令中有很多(看起来)相同的操作,比如我们在绘制一个列表时,同样属性的文字(标题,内容,昵称等)要绘制十几次,这时候如果把绘制命令重新排序、进行一定的合并和批处理,性能会提升很多。如下图:

+ 未经优化, 按顺序绘制

  • 优化后,一次绘制出所有的文字

第二步的具体过程还是很复杂的,比如涉及到Alpha绘制,相关的优化会失效,详情查看文章为什么alpha渲染性能低.

画在哪里

至于画在哪里,我们现在理解为一个缓冲(Buffer)中就可以了,具体的机制放在第三步讲。

到此,我们已经画(绘制)完了图像内容,把这个内容发送出去,第二步的任务就完成了。

Tip:

在Android L 之前,第二步的操作在应用进程的UI Thread中执行;
在Android L 之后, 第二步的操作在应用进程的RenderThread中执行。


3. 显示到屏幕

我们知道&

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值