gpu渲染性能调优

这里写图片描述

Android开发者选项中提供了Profile GPU Rendering功能,用于在屏幕上实时显示GPU渲染每一帧图像花费的时间(单位:ms)。
小米手机。 开发者选项——gpu呈现模式分析——在屏幕上显示为条形图

渲染时间用柱状图表示,上面的绿线代表16ms,也就是要尽量保证所有柱状图都在这条线下方。每一条柱状图都由3部分组成,蓝色、红色和黄色,代表渲染的3个不同的阶段,通过分析这三个阶段的时间就可以找到渲染时的性能瓶颈。

蓝色部分表示绘制时间或者在Java层创建和更新display list的时间。在一个View 实际被渲染前,它需要先转换为GPU能识别的格式。简单来说可能就是几个绘制命令,复杂一点,我们可能在嵌入了一条从canvas获取的自定义路径。这一步完成之后,输出结果就会被系统作为display list缓存起来。

蓝色部分记录了这一帧对所有需要更新的view完成这两步(转化成gpu识别的格式 作为display list 缓存)花费的时间。当它很高的时候,说明有很多view突然被作废无效(invalidate)重绘了,或者是有几个自定义view在onDraw函数中做了特别复杂的绘制逻辑。

红色部分代表执行时间,也就是Android 2D渲染引擎(OpenGL)执行display list的时间。为了将变化绘制在屏幕上,Android需要使用OpenGL ES API来绘制这些display list信息,OpenGL最终将数据传给了GPU,然后GPU渲染到屏幕上。View越复杂,OpenGL绘制所需要的命令也越复杂。如果红色这一段比较高,复杂的view都可能是罪魁祸首。还有值得注意的是比较大的峰值,这说明有些view重复提交了,也就是绘制了多次,而它们可能并不需要重绘。

橙色部分代表处理时间,更进一步,就是GPU告诉CPU渲染已经完成的时间。这部分是阻塞的,CPU会等待GPU知道确认收到了命令,如果这里比较高,说明GPU做的任务太多了,通常是由于很多复杂的view绘制从而需要过多的OpenGL渲染命令去处理。

CPU 与 GPU
现代的图形API不允许CPU直接与GPU通信,而是通过中间的一个图形驱动层(Graphics Driver)来连接这两部分。
图形驱动维护了一个队列,CPU把display list添加到队列里,GPU从这个队列取出数据进行绘制。

这里写链接内容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章