性能优化(十二)-性能优化课总结2

201 阅读4分钟

1、帧渲染过程中关键组件流程图

image.png

生产消费模型

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

面试中要能答出来

image.png

  • 1.SurfaceFlinger向HWC提供所有Layer的完整列表,让HWC根据其硬件能力,决定如何处理这些Layer。

  • 2.HWC会为每个Layer标注合成方式,表明是通过GPU还是通过HWC合成。

  • 3.SurfaceFlinger负责先把所有注明GPU合成的Layer合成到一个输出Bufer,然后把这个输出Bufer和其他Layer (注明HWC合成的Layer) 一起交给HWC,让HWC完成剩余Layer的合成和显示。

image.png

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、双缓冲机制

image.png

image.png

7、VSYNC偏移

image.png

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、流畅性解决方案思路

  1. 从dumpsys SurfaceFlinger --latency中获取127帧的数据
  2. 上面的命令返回的第一行为设备本身固有的帧耗时,单位为ns,通常在16.7ms左右
  3. 从第二行开始,分为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 太重太冗余 了,我们要小而美 个性化定制。经常崩溃。

  • 反问面试官?如果您认为新技术在软对中怎么推广?如果遇到阻力怎么办?