图像查看

  • 每个竖条都是一次VSync的时间16.6ms,如果竖条宽度变宽且透明则代表超出16.6ms绘制的帧
  • 每个Vsync信号来临前都会做工作(Choreographer中的postFrameCallback函数),按照顺序依次处理:INPUT 输入处理Animation动画处理Traversal 最终会调用到perfor的measure,layout,draw方法
  • 每个竖条中的不同颜色代表的上面每个步骤的处理时间

颜色区分

从下到上说明

INPUT 输入处理

表示应用执行输入事件回调中的代码所花的时间。如果此区段很大,表示应用花太多时间处理用户输入。不妨考虑将此类处理任务分流到其他线程。

建议:

其实就是处理输入事件开始到结束的时间,如果竖条中此颜色高度过高代表输入事件应放到其他线程去做

Animation动画处理

表示评估运行该帧的所有动画程序所花的时间。如果此区段很大,表示您的应用可能在使用性能欠佳的自定义动画程序,或因更新属性而导致一些意料之外的工作。

建议:

该帧内运行的动画比较多

Measure,Layhout

表示在视图层次结构中 onLayout 和 onMeasure回调上所花的时间。大区段表示处理视图层次结构需要很长时间。

Measure用来确定View的宽高,当View为ViewGroup的时候还需要遍历子View,Layout在进行遍历摆放到正确的位置,当View嵌套层级变多或者自定义View时复写这两个方法时也要考虑这种情况。

Draw

表示用于创建和更新视图显示列表的时间。如果竖条的此部分很高,表明可能有许多自定义视图绘制,或 onDraw 方法执行的工作很多。

上篇文章 Vsync信号和View绘制流程的关系中说到:draw方法其实并没有进行真正的绘制,而是把绘制的内容放入到了DisplayList中接着同步到RenderThread中。放入到DisplayList的命令其实就是对canvas的操作转换而来的,该列表命令过多有两种情况:1.可用的渲染数据失效。2.canvas的操作过多

将对Canvas的操作转换成Bitmap同步至GPU

表示将位图信息上传到 GPU 所花的时间。大区段表示应用花费大量的时间加载大量图形。

draw方法调用完成后,会进行释放这块内存区域并交给RenderThread去处理渲染数据。(释放的操作在native层对应的处理是把这块内存区域变成一个Bitmap交由RenderThread去渲染)帧的所有资源都必须位于 GPU 内存中才能用来绘制帧,因此需要上传到GPU中缓存起来

要减小该值,可以采用以下技巧:

  • 确保位图的分辨率不会比位图的显示尺寸大很多。应避免将 1024x1024 的图片显示为 48x48 的图片。
  • 利用 prepareToDraw() 在下一个同步阶段之前异步预上传位图。

RenderThread进行调用Opengl渲染

这个显示列表就是DisplayList

表示 Android 的 2D 渲染程序向 OpenGL 发出绘制和重新绘制显示列表的命令所花的时间。此竖条的高度与执行每个显示列表所花的时间的总和成正比。显示列表越多,红色竖条就越高。

发出将显示列表绘制到屏幕上所需的全部命令所需的时间

RenderThread会执行一个DrawFrameTask的Task,里面核心方法是DrawFrame。通过OpenGl和一些库将渲染数据通知给SurefaceFliger去做图层合成。将渲染数据放入到阻塞队列中。

这个和上面的要区分开,官方文档我没看太明白,我以我的理解阐述一下吧:

绘制的耗时不代表对canvas的操作复杂,可能仅仅是逻辑处理,但是调用OpenGl渲染反映的是对canvas的操作复杂,所以一个是说OnDraw复杂,一个是说对canvas操作的复杂,在加上其实Android会进行缓存。

在某些情况下,滚动、转换或动画会要求系统重新发送显示列表,但不必实际重新构建它(即重新捕获绘制命令)。因此,您可能会看到“发出命令”条较高,但“绘制命令”条并不高。

交换缓冲区

表示 CPU 等待 GPU 完成其工作的时间。如果此竖条升高,表示应用在 GPU 上执行太多工作。

当 Android 将其所有显示列表提交给 GPU 后,系统会发出最后一条命令,告诉图形驱动程序它已完成当前帧的处理。此时,驱动程序即可将更新后的图像显示到屏幕上。

GPU提交数据给SuraceFliger让其显示,接着CPU在吧数据给到GPU进行处理,这个区间就是CPU给到GPU的时间

最后给出官方的解析:

如果 CPU 发出命令的速度快于 GPU 处理命令的速度,这两个处理器之间的通信队列就会被占满。出现这种情况时,CPU 会阻塞并等待,直到队列中有位置来放置下一个命令。这种队列占满状态通常出现在“交换缓冲区”阶段,因为此时已提交了整个帧的命令。缓解此问题的关键是降低 GPU 工作的复杂度

Code For Better 谷歌开发者之声——使用 GPU 渲染模式分析工具进行分析相关推荐

  1. 【CoderSay】Code For Better 谷歌开发者之声 - 相遇2022GoogleSummit

    Code For Better 谷歌开发者之声 - 相遇2022GoogleSummit 1. 前言(CoderSay) 2. 主旨演讲 3. 技术专场 3.1 Android 3.2Tensorfl ...

  2. Code For Better 谷歌开发者之声——Google 产品深度学习

    文章目录 前言 1.Google Maps 2.Google Earth 3.Android 4. Google Translate 前言 各位开发者朋友们大家好,很高兴能参加本次谷歌开发者之声活动. ...

  3. Code For Better 谷歌开发者之声——初识Web与谷歌,拉起兴趣之心。

    个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来. 本篇励志:程序是我的生命,但我相信爱她甚过爱我的生命. 目录 一.了解谷歌浏览器 1. 简介 2.优点 二.认识Web ...

  4. Code For Better 谷歌开发者之声----谷歌云基于TensorFlow高级机器学习

    目录 前言 一.End-to-End Machine Learning with TensorFlow on GCP(基于TensorFlow的机器学习) 1.什么是TensorFlow 2.Tens ...

  5. Code For Better 谷歌开发者之声——使用谷歌浏览器 Chrome 更好地调试

  6. Code For Better 谷歌开发者之声—— 在 Windows 10 上对 Google Chrome 进行故障排除

  7. 开发者模式之GPU渲染模式分析

    手机自带的开发者选项中,有很多可以使用的工具,他们可以用来分析自己的应用的性能.绘制.anr等情况.下面主要说下PU渲染模式分析的简单讲解: GPU渲染模式分析 打开 在屏幕上显示为条形条图 模式 该 ...

  8. 谷歌开发者帐号申请流程_2020年针对软件开发人员角色的Google面试流程

    谷歌开发者帐号申请流程 Hello! I just finished interviewing with Google and wanted to quickly catch you up on so ...

  9. 使用谷歌开发者工具抓包

    使用谷歌开发者工具方法 使用方法:打开Google Chrome>>按快捷键12>>NetWork/网络>>刷新页面 过滤的功能: All:全部 Fetch/XHR ...

最新文章

  1. 进阶必备:CNN经典论文代码复现 | 附下载链接
  2. 19.04.27--作业 打字游戏
  3. linux存储--共享内存机制shm(十三)
  4. STM32的RTC简单操作
  5. 使用JUnit 5进行Spring Boot测试
  6. 如何查看kafka每个话题一共分了几个分区_如何决定kafka集群中话题的分区的数量...
  7. C++数据结构03--静态链式线性表的实现
  8. 【图像修复】基于matlab GUI自适应空间滤波图像修复【含Matlab源码 840期】
  9. 使用 PC 做 FTP/TFTP 服务器,上传和下载文件
  10. Greenplum 安装部署 单机版安装(Linux)
  11. ZZULIOJ 1190: 按出生日期排序(结构体专题)
  12. zigbee点对点对点操作 From zigbee菜鸟笔记(九)
  13. 专访北京中医药大学副教授郭凤英:产学合作,为新医科培养复合型人才
  14. python爬虫练习5:博客阅读量助手
  15. keras的seq2seq
  16. Python+NetworkX画图的nx.draw_networkx(函数详解)
  17. Spring Boot(号称Java当前最流行的开发框架) 中启动HTTPS
  18. 2020秋招——XX校招笔试编程题:回文串
  19. 我的世界Java种子算法_我的世界地图种子竟然有42亿个 那些神奇的建筑都是怎么生成的...
  20. windows - 屏幕抓取技术总结

热门文章

  1. 2015北京科技大学869计算机组成原理考试大纲,北京科技大学869计算机组成原理历年考研真题汇编附答案47p.doc...
  2. PyCharm安装第三方库如Requests
  3. 微信小程序开发入门与实战 ②(小程序与前端开发的区别)
  4. 单片机显示原理(LCD1602)
  5. Linux7配置team聚合链之主备模式
  6. svg-captcha生成验证码以及验证
  7. 机器学习 逻辑回归算法应用案例
  8. Matlab如何提取偶数行,得到矩阵的偶数/奇数索引 – MATLAB
  9. 程序出现错误如何解决
  10. 电子书《程序原本》小述