想想自己写的什么垃圾代码导致Vsync不能及时处理#(不高兴)

想不开?

实际开发中性能问题不好复现?这你就可能需要一些工具来帮你检测这种情况。

首先是Android系统自带的工具(4.1之后的版本),Profile GPU rending(GPU呈现分析),点击打开“以条形展示”之后,手机屏幕下方和上方会出现频谱,这个图有四个颜色的柱子,分别对应:

  • 蓝色:绘制时间,即创建和更新DisplayList的时间。蓝色线较高的地方,代表有可能有些任务需要重新绘制,或者onDrow方法中处理的事情太多了。
  • 红色:执行时间,即Android进行2D渲染DisplayList中的任务的时间。红线较高时,可能是因为重新提交了视图。
  • 橙色:处理时间,即CPU告诉GPU需要渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等GPU的回复命令。如果橙线很高,代表GPU繁忙或者处理任务多
  • 紫色:将资源转移到渲染线程的时间。仅在Android 4.0以上提供。

    效果大概如图:

    其中的绿线代表16ms,那么,每个柱状图超过绿线,说明又一次卡顿(jank)。

    这种效果虽然看起来很直观,但是在开发中难以用于分析。我们可以通过:adb shell dumpsys gfxinfo xxx.xxx.xxx(包名)来输出日志。其实偶尔丢失几帧很正常,但是我们要找出是什么UI问题导致绘制时间较长的。然后就可以找到你的垃圾代码了啦,是不是很厉害呢?


接下来还有更厉害的工具:TraceView

TraceView是AndroidSDK自带的工具,用来查看Trace文件视图。会产生一个图标,可以分析到每个应用每个方法所用的时间。使用TraceView需要先有个Trace日志文件,这个文件的获取方法有两种:

1.在DDMS中使用

首先打开DDMS。AndroidStudio则为Android Device Monitor。但是在AndroidStudio3.0+版本中,ADM已经被弃用了。我们需要在android-sdk/tools/目录的命令行中输入monitor。注意,这里必须安装JDK环境。链接设备后,点击Start Method Profiling。在监控完成之后,点击Stop Method Profiling即可。结束后会自动跳转到TraceView。

2.在代码中使用

这个方法更简单,但是却没有那么方便。直接在代码中需要开始监控的地方调用startMethodTracing()方法,在结束的时候调用stopMethodTracing()方法即可。startMethodTracing需要输入文件名参数,例如startMethodTracing("logs"),将会在SD卡目录下生成名为log.trace的文件。在Android4.4+的版本中,降低了对Trace文件分析次数,从而降低对性能的影响。但是精准度缺不会有很大的偏差。


我们再来说一下,TraceView工具怎么使用。

你写的什么垃圾代码让Vsync命令不能及时处理呢?(1)的更多相关文章

  1. 你写的什么垃圾代码让Vsync命令不能及时处理呢?(2)

    接上篇 1.TraceView Traceview看起来复杂,其实很简单: 上部分图中,X代表时间消耗,Y轴代表各个线程中的方法,且使用了不同颜色表示.面积越款,时间越长. 下部分为分析面板,分析面板 ...

  2. ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    最近在H5游戏项目中需要添加垃圾代码作混淆,提高过审机率.手动添加太费时费力,在网上并没有找到合适的比较好的工具,就自己动手写了一个垃圾代码添加工具,命名为ChaosTool. 扣扣交流群:81171 ...

  3. Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍

    最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能. Guava 项目是 Goog ...

  4. Auty自动化测试框架第六篇——垃圾代码回收、添加suite支持

    [本文出自天外归云的博客园] 垃圾代码回收 添加脚本恢复机制,因为框架会自动生成一些代码,如果代码生成后出现问题导致代码没有正常删除掉,则会造成代码垃圾,在auty目录添加recovery.py文件: ...

  5. 使用Swift的代理,闭包来封装一个公用协议减少垃圾代码

    iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题…… 比如说,我们先声网App中为了调用接口,做简单的判 ...

  6. CodeMixerPro工具,完美替代ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 扣扣交流群:811715780 进入 Proje ...

  7. CodeMixer工具,完美替代ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 扣扣交流群:811715780 进入 Proje ...

  8. python实现统计你一共写了多少行代码

    程序员要保证一定的代码量就必须勤奋的敲代码,但怎么知道自己一共写了多少代码呢,笔者用python写了个简单的脚本,遍历所有的.java,.cpp,.c文件的行数,但是正如大家所知,java生成了许多代 ...

  9. 如何写出无法维护的代码(JAVA版)

    程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...

随机推荐

  1. openssl生成RSA格式的公私钥,并转为pkcs8格式

    第一步:生成私钥,这里我们指定私钥的长度为2048 openssl genrsa -out rsa_private_key.pem 2048 第二步:根据私钥生成对应的公钥: openssl rsa ...

  2. Visual Studio 2015中使用gdb远程调试linux程序

    VS的debug功能非常强大,相比而言linux上的图形化调试一直不是很好用. 如果可以使用VS来调试linux程序,应该是一件比较愉快的事情. 这在2015中变得可能,因为从2015开始VS支持An ...

  3. 【链表】Odd Even Linked List

    题目: Given a singly linked list, group all odd nodes together followed by the even nodes. Please note ...

  4. 仿制淘宝sku点击效果

    1.依赖jquery,主要利用二维数组. 2.原生手写. 代码如下: <!DOCTYPE html> <html> <head> <meta charset= ...

  5. 判断产品Key的正则表达式(格式: ABCD1-ABCD2-ABCD3-ABCD4-ABCD5)

    正则表达式: ^[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}$ 改进: ^([A-Za-z0-9 ...

  6. SQLAlchemy使用说明之ORM

    对象关系映射(Object Relation Map, ORM)可以将一个类映射为关系模式(数据表). 使用ORM比直接书写SQL在安全性,可读性上都有很大优势. Working with Relat ...

  7. 云存储(Swift+Keystone)部署策略

    Swift是OpenStack的对象存储模块,Keystone是OpenStack的权限验证模块.可以于这两个模块搭建一个较为完善的云存储系统. 1.官方方案 云存储的服务器分三种类型: 验证节点 A ...

  8. 10.Set 和 Map 数据结构

    Set 和 Map 数据结构 Set 和 Map 数据结构 Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来 ...

  9. [转]VS2013中使用Git建立源代码管理

    本文转自:https://blog.csdn.net/bodybo/article/details/38976549 第一次在VS2013中使用Git,也是第一次使用Git,各种不熟悉.百度各种使用经 ...

  10. vue中watch数组或者对象

    1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValue) { console. ...