1、帧渲染过程中关键组件流程图
生产消费模型
1.1图像生产者
OpenGLES Canvas 2d 和媒体解码器
1.2 图像消费者
SurfaceFlinger是最常见的图像消费者。 window Manager 把图像信息收集起来提供给SurfaceFlinger合成后再把图形信息传递给显示器。它也是唯一一个能够改变显示器内容的服务。它使用OpenGl和Hardware Composer来生成surface。
一些OpenGL ES也能充当图像消费者,比如相机可以直接使用相机的预览界面图像流,一些非GL应用也可以是消费者,比如ImageReader。
1.3 Windows Manager
WindowsManager用来控制window。每个window都有一个surface。WindowsManager会监视window的许多信息,比如屏幕方向、转换、动画、位置。把这些信息发给SurfaceFlinger,这样SurfaceFlinger就能将window metadata合成到显示器的surface。
1.4 Hardware Composer
- 为硬件层HAL的子系统,SurfaceFlinger的部分工作可以
委托给Hardware Composer,以减轻OpenGL和GPU的工作。 - SurfaceFlinger此时是OpenGL ES客户端,当SurfaceFlinger将一个缓冲区或者两个缓冲区合成到第三个缓冲区中时,使用OPENGL es会比 GPU高效。
1.5 GUI框架
多个layer
面试中要能答出来
-
1.SurfaceFlinger向HWC提供所有Layer的完整列表,让HWC根据其硬件能力,决定如何处理这些Layer。
-
2.HWC会为每个Layer标注合成方式,表明是通过GPU还是通过HWC合成。
-
3.SurfaceFlinger负责先把所有注明GPU合成的Layer合成到一个输出Bufer,然后把这个输出Bufer和其他Layer (注明HWC合成的Layer) 一起交给HWC,让HWC完成剩余Layer的合成和显示。
2、关于帧率
即 Frame Rate,单位 fps,是指 gpu 生成顿的速率,如 33 fps,60fps,越高越好.但是对于快速变化的游戏而言,你的FPS很难一直保持同样的数值,他会随着你所看到的显示卡所要描画的画面的复杂程度面变松
3、surface
vsync屏幕的重绘 16ms SurfaceView&View 双缓冲机制
4、Vsync
Android中有两种Vsync信号:
- 1、屏幕产生的硬件Vsync:硬件Vsync是一个脉冲信号,起到开关或者触发某种操作的作用
- 2、被SurfaceFlinger将其转成的软件Vsync信号:经由Binder传递给Choreographer。
5、单层缓冲引发的“画面撕裂问题”
生产比消费快,没有所来控制同步,容易出问题。
6、双缓冲机制
7、VSYNC偏移
2缓冲,back buffer frame buffer 。GPU向Back buffer中写,屏幕从frame buffer中读数据。vsync 信号调度从back buffer到frame buffer中复制操作,可认为瞬间完成操作。
- 一个屏幕周期完成,vsnc信号产生,完成复制操作,然后通过CPU/GPU绘制下一帧。
- 只有当VSNC信号产生,CPU/GPU 才会开始绘制,这样就能同步,避免撕裂。
8、Jank 掉帧
注意,当 VSync 信号发出时,如果 GPU/CPU 正在生产帧数据,此时不会发生复制操作。屏幕进入下一个刷新周期时,从 Frame Buffer 中取出的是“老”数据,而非正在产生的帧数据,即两个刷新周期显示的是同一帧数据。这是我们称发生了“掉帧”(Dropped Frame,Skipped Frame,Jank)现象。
9、流畅性解决方案思路
- 从dumpsys SurfaceFlinger --latency中获取127帧的数据
- 上面的命令返回的第一行为设备本身固有的帧耗时,单位为ns,通常在16.7ms左右
- 从第二行开始,分为3列,一共有127行,代表每一帧的几个关键时刻,单位也为ns
第一列t1 开始绘图 第二列t2 软件VSYNC 第三列t3 SF将帧传给HW
如果t3-t1>16.7ms,则认为发生一次掉帧(卡顿)?
10、APM
10.1性能优化的思路
- 主流的项目怎么做的。Matrix,以lib的形式拆开的,比如battery。apk canary fd 流量 traffix 组件化 内存。
- 依赖于common中间层,以公用类,utils,反射、hook、线程池pool。
- 比如奇虎360.ArgusAPM。
- 各个gradle,
- 类似组件化、common library(反射、工具类 获取进程ID)、业务(电量、网络监听、资源问题、anr、内存、FPS UI的问题)
- 达成aar包,每个功能组件都打成aar包,想用哪个集成哪个。(Maven私有仓库)
- 做执勤啊讲下Matrix 和ArgusAPM
- 我们引入gradle插件,专门人在做。
10.2把知识产出为方案。
-
自定义gradle?
-
matrix 太重太冗余 了,我们要小而美 个性化定制。经常崩溃。
-
反问面试官?如果您认为新技术在软对中怎么推广?如果遇到阻力怎么办?