Code For Better 谷歌开发者之声——使用 GPU 渲染模式分析工具进行分析
图像查看
- 每个竖条都是一次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 渲染模式分析工具进行分析相关推荐
- 【CoderSay】Code For Better 谷歌开发者之声 - 相遇2022GoogleSummit
Code For Better 谷歌开发者之声 - 相遇2022GoogleSummit 1. 前言(CoderSay) 2. 主旨演讲 3. 技术专场 3.1 Android 3.2Tensorfl ...
- Code For Better 谷歌开发者之声——Google 产品深度学习
文章目录 前言 1.Google Maps 2.Google Earth 3.Android 4. Google Translate 前言 各位开发者朋友们大家好,很高兴能参加本次谷歌开发者之声活动. ...
- Code For Better 谷歌开发者之声——初识Web与谷歌,拉起兴趣之心。
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来. 本篇励志:程序是我的生命,但我相信爱她甚过爱我的生命. 目录 一.了解谷歌浏览器 1. 简介 2.优点 二.认识Web ...
- Code For Better 谷歌开发者之声----谷歌云基于TensorFlow高级机器学习
目录 前言 一.End-to-End Machine Learning with TensorFlow on GCP(基于TensorFlow的机器学习) 1.什么是TensorFlow 2.Tens ...
- Code For Better 谷歌开发者之声——使用谷歌浏览器 Chrome 更好地调试
- Code For Better 谷歌开发者之声—— 在 Windows 10 上对 Google Chrome 进行故障排除
- 开发者模式之GPU渲染模式分析
手机自带的开发者选项中,有很多可以使用的工具,他们可以用来分析自己的应用的性能.绘制.anr等情况.下面主要说下PU渲染模式分析的简单讲解: GPU渲染模式分析 打开 在屏幕上显示为条形条图 模式 该 ...
- 谷歌开发者帐号申请流程_2020年针对软件开发人员角色的Google面试流程
谷歌开发者帐号申请流程 Hello! I just finished interviewing with Google and wanted to quickly catch you up on so ...
- 使用谷歌开发者工具抓包
使用谷歌开发者工具方法 使用方法:打开Google Chrome>>按快捷键12>>NetWork/网络>>刷新页面 过滤的功能: All:全部 Fetch/XHR ...
最新文章
- 进阶必备:CNN经典论文代码复现 | 附下载链接
- 19.04.27--作业 打字游戏
- linux存储--共享内存机制shm(十三)
- STM32的RTC简单操作
- 使用JUnit 5进行Spring Boot测试
- 如何查看kafka每个话题一共分了几个分区_如何决定kafka集群中话题的分区的数量...
- C++数据结构03--静态链式线性表的实现
- 【图像修复】基于matlab GUI自适应空间滤波图像修复【含Matlab源码 840期】
- 使用 PC 做 FTP/TFTP 服务器,上传和下载文件
- Greenplum 安装部署 单机版安装(Linux)
- ZZULIOJ 1190: 按出生日期排序(结构体专题)
- zigbee点对点对点操作 From zigbee菜鸟笔记(九)
- 专访北京中医药大学副教授郭凤英:产学合作,为新医科培养复合型人才
- python爬虫练习5:博客阅读量助手
- keras的seq2seq
- Python+NetworkX画图的nx.draw_networkx(函数详解)
- Spring Boot(号称Java当前最流行的开发框架) 中启动HTTPS
- 2020秋招——XX校招笔试编程题:回文串
- 我的世界Java种子算法_我的世界地图种子竟然有42亿个 那些神奇的建筑都是怎么生成的...
- windows - 屏幕抓取技术总结
热门文章
- 2015北京科技大学869计算机组成原理考试大纲,北京科技大学869计算机组成原理历年考研真题汇编附答案47p.doc...
- PyCharm安装第三方库如Requests
- 微信小程序开发入门与实战 ②(小程序与前端开发的区别)
- 单片机显示原理(LCD1602)
- Linux7配置team聚合链之主备模式
- svg-captcha生成验证码以及验证
- 机器学习 逻辑回归算法应用案例
- Matlab如何提取偶数行,得到矩阵的偶数/奇数索引 – MATLAB
- 程序出现错误如何解决
- 电子书《程序原本》小述