• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android性能优化

Android性能优化

作者:消除卡顿 - JackChan 字体:[增加 减小] 来源:互联网 时间:2017-07-22

消除卡顿 - JackChan通过本文主要向大家介绍了性能优化,内存优化,网络优化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

性能优化系列阅读

  • Android性能优化
  • 性能优化 - 消除卡顿
  • 性能优化 - 内存优化
  • 性能分析工具 - TraceView
  • Android性能分析工具

消除卡顿

  • 什么是卡顿及卡顿的衡量标准
  • 产生卡顿的原因
  • 通用优化流程
  • 定位卡顿原因

什么是卡顿

卡顿是人的一种视觉感受,比如我们滑动界面时,如果滑动不流程我们就会有卡顿的感觉,这种感觉我们需要有一个量化指标,在编程时如果开发的程序超过了这个指标我们认为其是卡顿的。

FPS(帧率):每秒显示帧数(Frames per Second)。表示图形处理器每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。30fps就是可以接受的,但是无法顺畅表现绚丽的画面内容。提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps就不容易察觉到有明显的流畅度提升了,如果是VR设备需要高于75fps,才可能消除眩晕的感觉。

开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms≈1000/60的时间来处理所有的任务。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps。

1495598311058

如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

1495598327691

如果此时用户在看动画的执行或者滚动屏幕(如RecyclerView),就会感觉到界面不流畅了(卡了一下)。丢帧导致卡顿产生。

流畅的情况下:

1495598346607

出现了丢帧现象(卡顿)

1495598358290

严重丢帧(卡死了)

1495598368704

给我们一种感觉,如果帧率越低,卡顿就越严重,那么是不是就可以使用帧率来衡量卡顿那?

如何衡量卡顿

FPS的高低不能准确的反映应用的流程度。如下图所示,只有有更新的时候才刷新界面。

1495598311058

当界面没有变动的时候,手机不需要对界面进行更新,所以此时的FPS会很低,如果1秒钟内都没有变动那么FPS=0。所以我们需要利用其他方式来衡量应用的流程度,比如可以利用丢帧数来衡量。

单位时间内丢帧数可以反映出应用是否流程。不丢帧是终极目标,但每秒丢帧在6-7帧左右可以接受,如果丢10帧以上就需要优化了。

丢帧情况(单位时间内均匀分布) 卡顿情况
0-10帧 流畅
10-20帧 较卡
20-40帧 很卡
40-60帧 卡死了

对于我们开发人员来说,会使用一些工具找出卡顿比较集中的地方,找出原因,消除或减弱卡顿。(测试团队会有专门的工具去测试丢帧的情况)

卡顿产生的原因

核心:分析在16ms中我们的应用做了什么工作,那些工作阻止我们在16ms时更新界面。

通常情况下,在16ms中我们有那些工作需要处理。

单以XML布局被绘制出来为例进行说明。

处理过程:

  1. CPU负责把UI组件计算成多边形和纹理
  2. OpenGL负责绘制图像(Display List)
  3. GPU栅格化需要显示内容并渲染到屏幕上

而实际开发中我们还加入交互、业务处理等工作,这些工作都需要在16ms中处理完成。对于开发人员来说,需要有一个工具,很直观的帮助我们判断出那些工作占用了多少时间。

Profile GPU Rendering

通过手机开发者选项中提供的Profile GPU Rendering(GPU呈现模式分析)功能,我们可以清楚的看到处理流程中各部分的耗时。手机端工具(开发助手àGPU渲染图)。建议大家在Android6.0及以上手机测试。

打开Profile GPU Rendering操作截图如下:

1495598620838 1495598567075 1495598518583

大家可以拿着真机配置一下。看看有什么变化。

1495598647344 1495598656043

条形图说明

  1. 水平方向的一根绿线代表16ms。
  2. 每条都代表一帧画面所有工作内容
  3. 每条中不同的颜色代表不同的工作内容

Android6.0及以上的手机颜色对应关系如下:

1495598717920

原因分析

通用优化流程

第一步:UI层优化

1、UI问题比较容易查找
2、一旦出现问题影响范围广(xml、mesure、layout、draw、Display List 、栅格化……)

工具:设备过渡绘制查看功能、HierarchyViewer等

常见问题:过渡绘制、布局复杂、层级过深……

过渡绘制

在屏幕一个像素上绘制多次(超过两次)。如:文本框,如果设置了背景颜色(黑色),那么显示的文字(白色)就需要在背景之上再次绘制。

打开手机开发者中的过渡绘制区域即可查看。蓝色标识这个区域绘制了两次。

1495598808556

说明:

  1. 如果大面积都是蓝色,属于正常情况。
  2. 重点关注大面积绿色及以后的,表示存在过渡绘制。

设备中的该选项只能直观的让我们感受到应用的界面是否存在过渡绘制,如果存在,我们需要利用Hierarchy Viewer查找布局中不合理的地方。

过渡绘制小案例

效果图如下

1495599983542

大面积存在过渡绘制,文字区域最严重。查询Item布局文件找出过渡绘制的原因

1495600004253

自定义控件绘制优化

Clip Rect 与 Quick Reject

  • Clip Rect:识别可见区域
  • Quick Reject:控件所在的矩形区域是否有交集

在Canvas中有上述两个方法,帮助我们进行判断,避免出现过渡绘制。

我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域,在这个区域之外的我们不在进行绘制。如侧拉菜单,当菜单显示的时候被菜单遮挡的部分是不用进行绘制的,一旦绘制就会出现过渡绘制现象。系统的控件会控制过渡绘制,但我们自己的控件就需要自行管理了。所以在使用侧拉菜单时就需要优先考虑系统提供的了。

1495598860734

如果系统没有提供的,我们自己编写时也需要注意,避免出现过渡绘制。

自定义控件过渡绘制

案例效果

1495600074884

编写自定义控件MyVIew,在布局中引入该控件

<com.itheima.overdrawdemo.MyView
    android:layout_width="match_parent"
    android:layout_height=
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android性能优化
  • Android性能优化
  • linux 内存性能调优
  • Android性能优化的浅谈,android性能优化
  • Android开发:优化ListView实践解析
  • Android高性能ORM数据库DBFlow入门,ormdbflow

相关文章

  • 2017-05-26Android动态加载Dex机制解析
  • 2017-05-26关于视频编辑SDK的接入说明,视频编辑sdk接入
  • 2017-05-26读《重构手册》-重构之姊妹篇有感,《重构手册》姊妹篇
  • 2017-05-26自定义Toast的显示位置和显示内容,自定义toast
  • 2017-05-26粗暴的解释Android与蓝牙Ble之间的通信,android蓝牙ble
  • 2017-05-26安卓应用程序的签名
  • 2017-05-26Android中使用ExpandableListView实现好友分组,expandablelistview
  • 2017-05-26Android获取本地相册图片、拍照获取图片,
  • 2017-05-26深入理解 Android 之 View 的绘制流程,androidview
  • 2017-05-26Android开发笔记(6)——类的设定与继承,android笔记

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Picasso处理同一url,但资源变了的情况,picassourl
    • 使用LogPhoneUtil工具类在Android手机保存APP运行日志,android日志工具类
    • Android 官方推荐 : DialogFragment 怎样创建对话框
    • android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程
    • ionic 配置环境变量及创建新项目,ionic新项目
    • MAC下写入ntfs文件系统
    • android开发之路08(ListView&amp;Adapter),androidlistview
    • IRQ全称为Interrupt Request
    • Android 优秀的开源框架整理,android开源框架
    • 手机安全卫士——手机防盗页面,安全卫士防盗页面

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有