绘制性能分析:GPU Rendering Profile

QuibblerQuibbler 2020-08-21 约 11 分钟 4469 次阅读

绘制性能分析:GPU Rendering Profile

随着手机硬件的发展,内存从当初512Mb到现在的12Gb甚至更多,CPU也换代到了晓龙865,手机运行速度越来越快,能够运行更多应用,功能更加丰富,硬件和软件之间在发展道路上相互促进。虽然硬件发展,但是软件也还是需要进行优化,不能无限制的使用手机硬件资源。因为手机作为便携的移动设备,本身的性能就无法和PC相媲美。

APP的性能优化是应用开发过程中,除了完成基本功能开发之外比较重要的一个环节。优化涉及到的知识点很多,方方面面:绘制优化、内存优化、电量优化、启动速度、APK优化等等。

1、 绘制简介

从事Android开发的对View的绘制都再熟悉不过了,View的绘制分为三步:measure、layout、draw,这三步都是Android Frameworks提供的开发接口,而真正的绘制是在Native层的SurfaceFlinger服务。

1.1、60fps   16ms

通常手机的帧率在60fps,Android系统每隔16ms就会发送VSYNC信号,触发UI界面的刷新。

1000ms÷60fps = 16ms/fps

所以主线程也就是UI线程的操作不能费时,超过16ms就无法正常渲染,达不到60fps,严重的情况下会出现卡顿。

1.2、卡顿原因

从上面简单的背景就可以明白,各种造成卡顿的疑难杂症归根结底都将导致UI经常无法在16ms内完成操作,导致丢帧。

①布局过于复杂,层级太深。布局优化见《布局优化 & 过度绘制检测》

②动画过于复杂

③View过度绘制,同一块区域被绘制覆盖多次

④UI线程执行耗时操作

⑤频繁GC导致进程暂停,产生卡顿

2、 GPU Rendering Profile简介

光靠工程师或者体验去使用有时候很难看出卡顿,还好有很多工具帮助我们分析绘制卡顿。这里介绍的就是Android手机自带的开发者选项:GPU Rendering Profile

在开发者选项监控菜单组中有一个菜单:GPU呈现模式分析。打开就可以去自己的应用查看绘制的卡顿情况。

但是还要先来了解一下上面那几种颜色。Google给出官方的颜色说明(Analyze with Profile GPU Rendering)

①MiscTime/VSync Delay:代表在连续两帧间的时间间隔,可能是因为子线程执行时间过长抢占了UI线程被cpu执行的机会

②Input Handing:代表app在用户输入事件回调中花费的时间,这部分过高可能意味着app处理用户输入事件时间过长,建议将操作分流到工作线程

③Animation:代表为该帧内所有animator求值(属性动画中代表通过估值器计算属性的具体值)

④Measure/Layout:代表了onLayout和onMeasure方法消耗的总时间,这段很高代表遍历整个view树结构花费了太多时间

⑤Draw:代表创建更新DisplayList的时间,过高代表在onDraw中花费过多时间,可能是自定义画图操作太多或执行了其它操作

⑥Sync/upload:向CPU传输Bitmap花费的时间,过高代表了加载了大量图形

⑦Issue commands:Android 2D渲染器向OpenGL发出命令绘制或重绘display lists 花费的时间,柱子的高度等于所有Display list绘制时间的总和

⑧Process/Swap buffers:代表cpu在等待gpu完成工作,如果过高代表GPU需要完成的工作过多

3、 GPU分析模式

GPU Rendering Profile提供两种呈现模式分析:在屏幕上显示为条形图和在adb shell dumpsys gfxinfo输出日志。

3.1、条形图

打开开发者选项 > GPU呈现模式分析 > 在屏幕上显示为条形图。进入需要调试的应用即可直观的查看页面绘制情况。

3.2、日志

打开开发者选项 > GPU呈现模式分析 > 在adb shell dumpsys gfxinfo中

输出下面的命令查看绘制输出的日志

adb shell dumpsys gfxinfo

截取部分绘制日志如下:

** Graphics info for pid 19030 [com.baidu.input_huawei] **
Stats since: 37817926843708ns
Total frames rendered: 52
Janky frames: 14 (26.92%)
50th percentile: 10ms
90th percentile: 40ms
95th percentile: 150ms
99th percentile: 150ms
Number Missed Vsync: 9
Number High input latency: 4
Number Slow UI thread: 13
Number Slow bitmap uploads: 2
Number Slow issue draw commands: 1
Number Frame deadline missed: 14
HISTOGRAM: 5ms=6 6ms=6 7ms=7 8ms=3 9ms=4 10ms=1 11ms=1 12ms=2 13ms=3 14ms=3 15ms=1 16ms=1 17ms=0 18ms=1 19ms=0 20ms=1 21ms=0 22ms=0 23ms=0 24ms=1 25ms=0 26ms=1 27ms=0 28ms=0 29ms=0 30ms=0 31ms=1 32ms=1 34ms=1 36ms=1 38ms=0 40ms=1 42ms=1 44ms=0 46ms=0 48ms=0 53ms=0 57ms=0 61ms=0 65ms=0 69ms=0 73ms=0 77ms=0 81ms=0 85ms=0 89ms=0 93ms=0 97ms=0 101ms=0 105ms=0 109ms=1 113ms=0 117ms=0 121ms=0 125ms=0 129ms=0 133ms=0 150ms=3 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0 1050ms=0 1100ms=0 1150ms=0 1200ms=0 1250ms=0 1300ms=0 1350ms=0 1400ms=0 1450ms=0 1500ms=0 1550ms=0 1600ms=0 1650ms=0 1700ms=0 1750ms=0 1800ms=0 1850ms=0 1900ms=0 1950ms=0 2000ms=0 2050ms=0 2100ms=0 2150ms=0 2200ms=0 2250ms=0 2300ms=0 2350ms=0 2400ms=0 2450ms=0 2500ms=0 2550ms=0 2600ms=0 2650ms=0 2700ms=0 2750ms=0 2800ms=0 2850ms=0 2900ms=0 2950ms=0 3000ms=0 3050ms=0 3100ms=0 3150ms=0 3200ms=0 3250ms=0 3300ms=0 3350ms=0 3400ms=0 3450ms=0 3500ms=0 3550ms=0 3600ms=0 3650ms=0 3700ms=0 3750ms=0 3800ms=0 3850ms=0 3900ms=0 3950ms=0 4000ms=0 4050ms=0 4100ms=0 4150ms=0 4200ms=0 4250ms=0 4300ms=0 4350ms=0 4400ms=0 4450ms=0 4500ms=0 4550ms=0 4600ms=0 4650ms=0 4700ms=0 4750ms=0 4800ms=0 4850ms=0 4900ms=0 4950ms=0
Font Cache (CPU):
  Size: 100.87 kB 
  Glyph Count: 17 
CPU Caches:
GPU Caches:
  Other:
    Other: 0.00 bytes (1 entry)
  Image:
    Texture: 872.12 KB (18 entries)
  Scratch:
    Texture: 4.00 MB (1 entry)
    Buffer Object: 48.00 KB (1 entry)
Other Caches:
                         Current / Maximum
  VectorDrawableAtlas    0.00 kB /   0.00 KB (entries = 0)
  Layers Total           0.00 KB (numLayers = 0)
Total GPU memory usage:
  5136508 bytes, 4.90 MB (872.12 KB is purgeable)

相关博客:

        Analyze with Profile GPU Rendering

        Android系统显示原理简介

        View的绘制原理

        AndroidView的绘制原理

        View的绘制原理

        Android 工具:Profile GPU Rendering

        UI优化之-GPU Rendering Profile

关于Android中16ms的问题

Android的16ms和垂直同步以及三重缓存

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w