Android持续优化 - 提高流畅度 - Go语言中文社区

Android持续优化 - 提高流畅度



http://www.cnblogs.com/purediy/p/3492865.html

http://www.cnblogs.com/purediy/p/3492865.html

http://www.cnblogs.com/purediy/p/3492865.html




Android持续优化 - 提高流畅度

一.形象的感官一下流畅度概念

1. 这是官方给出的概念:Android流畅运行,需要运行60帧/秒, 则需要每帧的处理时间不超过16ms。

2. 每秒帧数,实际上就是指动画或视频每秒放映的画面数。因此“帧”的概念就是指“画面”,1幅画就叫做“1帧”,每秒帧数指的就是“每秒播放的画面数”。帧数就是在1秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。

3. 一帧占用内存数

当画面的分辨率是1024×768,刷新率要达到60帧/秒时,那么显卡在一秒钟内需要处理的像素量就达到了“1024×768×60=5713920”。那么一个“像素量”,相当与占用多少内存?我们用位图来代替粗略计算,把分辨率是1024×768看成一张对应大小的位图,通过位图的大小来大概计算占用的内存大小。而位图的存储算法,在维基百科上有详细的介绍,详见下面的链接。

一张1024×768的16位(bit)位图文件大小 = 1024×768×16/8 = 1572864 B = 1536 KB = 1.5 MB。如果要求画面的刷新率达到60帧/秒,则每秒需要处理的数据量就达到1.5 * 60 = 90 MB,这个数据是相当大。

实际系统中会通过GPU显卡处理显示,减少CPU工作量,或者系统会缓存或局部刷新来降低处理量。没有研究过,也很想研究一下显示的流程。

二.Android流畅度的根本:解放UI主线程

1. 不要阻塞UI线程;

2. 不要在UI线程之外操作UI。

三.以ListView加载图片为例

更流畅?

1. ListView如何流畅顺滑加载?

2. ListView使用convertView可以提高两倍性能?

3. ListView回收item的原理是什么?

4. ListView重复加载调用的问题?

5. 如何解决图片加载OOM问题?

6. 如何更流畅的加载图片?

7. ListView加载大量图片并发问题?

ListView优化要点

1. 优化Adapter,使用convertView,效率提高2倍;

2. 优化item布局,提高整体性能;

3. ListView重复调用问题可以设置layout_height高度固定或者fill_parent,加载的原理;

4. 使用addHeader和addFooter代替ScrollView;

图片加载优化要点

1. 有效加载大图片,合理设置BitmapFactory.Options的inSampleSize值,减少图片内存占用;

2. 仅请求图片的大小,inJustDecodeBounds = true,仅请求图片大小,而不会加载图片到内存;

3. 缓存图片,内存缓存LruCache,硬盘缓存 DiskLruCache

4. 使用非UI线程加载图片,使用 AsyncTask

5. 使用软引用SoftReference,绑定ImageView和url,处理ListView并发加载问

6. Android官方图片加载利器BitmapFun解析

四.其他

Google官方教程(一定要读):

Android进程和线程-Processes and Threads

改善布局性能-Improving Layout Performance

1. 优化布局层次结构—Optimizing Layout Hierarchies

2. 使用标签include重用布局—Re-using Layouts with include

3. 按需加载视图—Loading Views On Demand

4. ListView的平滑滚动—Making ListView Scrolling Smooth

高效显示位图-Displaying Bitmaps Efficiently

1. 有效的处理较大的位图-Loading Large Bitmaps Efficiently

2. 处理来自UI线程的位图-Processing Bitmaps Off the UI Thread

3. 缓存位图-Caching Bitmaps

4. 在你的UI中显示位图-Displaying Bitmaps in Your UI

其他好文章:

Android开发规范之编码规范

Android开发性能优化简介

参考:

1. 每秒帧数
2. 位图

分类: android






http://www.cnblogs.com/purediy/p/3232996.html

http://www.cnblogs.com/purediy/p/3232996.html

http://www.cnblogs.com/purediy/p/3232996.html



[整]Android开发优化-布局优化

优化布局层次结构

一个普遍的误解就是,使用基本的布局结构会产生高效的布局性能。然而每一个添加到应用的控件和布局,都需要初始化,布局位置和绘制。比如,使用一个嵌套的LinearLayout会导致过深的布局层次结构。此外,嵌套多个使用layout_weight属性的LinearLayout实例会花费更大的代价,因为每一个子布局都要测量两次。当某个布局被频繁渲染时,比如它在ListView或GridView中使用,就显得尤为重要。

在这节课中,将学会使用Hierachy Viewer和Layoutopt工具对布局结构进行检测和优化。

检测你的布局

在Android SDK tools中包含一个叫做HierchyViewer工具,它可以在你运行应用时候帮助你分析你的布局性能。通过它你可以发现你的布局中性能比较差的那些地方。

HierchyViewer需要你选择一个已链接的设备或者模拟器中的一个运行的线程,显示出布局的树结构。每个块上的红绿灯代表它的测量,布局,以及绘图性能,帮助你找出潜在的问题。

比如,图1显示了一个用于ListView中的Item的布局。这个布局的左边显示了一幅图片,两个叠在一起的文字item放在右边。那些被重复加载的布局在优化时候显得有为重要。

id="iframe_0.5143029645672845" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://developer.android.com/images/training/layout-listitem.png?_=3232996%22%20style=%22border:none;max-width:804px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.5143029645672845',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; outline: none 0px; border-width: initial; border-style: none; width: 20px; height: 20px;">

图1. 一个ListView内item的概念设计

hierchyviewer 工具可以在<sdk>/tools/中找到。当打开给工具后,就会显示可用的设备列表一个这些设备中运行的部分。点击“Load View Hierchy”选项查看被选中部分的布局层次图。比如,图2显示了图1中布局结构图。

id="iframe_0.3351208724202346" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://developer.android.com/images/training/hierarchy-linearlayout.png?_=3232996%22%20style=%22border:none;max-width:804px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.3351208724202346',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; outline: none 0px; border-width: initial; border-style: none; width: 20px; height: 20px;">

图2. 图1的布局层次结构图,使用内嵌的LinearLayout实例布局。

  id="iframe_0.6365931243867538" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://developer.android.com/images/training/hierarchy-layouttimes.png?_=3232996%22%20style=%22border:none;max-width:804px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.6365931243867538',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; outline: none 0px; border-width: initial; border-style: none; width: 20px; height: 20px;">

图3. 点击层次图中一个节点,显示它的运行时间

图2中,你可以看到一个3层的布局结构图,并且在布局text的items里面有一些问题。点击这些items显示进程中每个阶段所花费的时间。它显示的很清楚,哪些items在测试,布局中花费时间最长,哪些地方需要花费时间去优化。

使用该布局加载所有item所花费的时间如下:

  • Measure: 0.977ms

  • Layout: 0.167ms

  • Draw: 2.717ms

修改布局

因为上述布局性能较低的原因主要是由一个内嵌的LinearLayout所引起,将该布局使用浅而广的扁平化结构代替深而窄的树形结构化设计,从而提高性能。在这些布局中,将RelativeLayout作为一个根节点,这样,你将会看到该布局变为一个2层的结构,修改后的布局如下:

id="iframe_0.5537882157872773" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://developer.android.com/images/training/hierarchy-relativelayout.png?_=3232996%22%20style=%22border:none;max-width:804px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.5537882157872773',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; outline: none 0px; border-width: initial; border-style: none; width: 20px; height: 20px;">

图4. 使用RelativeLayout的图1的布局。

修改后加载item所花费的时间:

  • Measure: 0.598ms

  • Layout: 0.110ms

  • Draw: 2.146ms

虽然看起来提高度很小,但是这布局提高是被重复操作的,因此,这个布局是在listview中的每一个item里面。

更多情况的一个时间差异,是在使用了layout_weight属性的LinearLayout设计里面,这样的设计会降低测量的速度。这只是一个示例说明每个布局是否被适当的使用,在使用layout weight属性时候,你应该谨慎考虑是否必要。

使用Lint

这是一个好习惯,在你的布局文件内运行Lint工具,寻找那些可能要优化的布局结构。Lint工具代替Layoutopt工具,并且有更大的功能。如下是Lint的一些示例:

  • 使用复杂的图片:在LineraLayout布局中包含一个ImageView和一个TextView,可以使用一个复杂的drawable代替,性能会更好。
  • 合并根框架:假如一个FrameLayout作为一个布局的根视图,不提供背景或者填充,它可以被一个带有<merge/>标志的布局代替。
  • 无用的树叶:对于一个扁平结构中一个布局没有孩子,没有背景,可以被删掉。
  • 无用的父类:一个布局不是ScrollView或者不是一个根布局,也没有背景,只有一个孩子节点,可以被删掉,孩子节点直接放入到这个扁平的父类里面。
  • 深度布局:布局若有太多内嵌,则性能很差。考虑使用RelativeLayout 以及GridLayout等扁平化布局代替。默认布局最大深度是10.

使用Lint另一个好处是,它被内嵌到ADT16+.当你在导入apk,编辑或者保存一个xml文件,Lint都会自动运行。点击Eclipse工具栏中Lint按钮,会人为强制运行Lint.

id="iframe_0.15854737226949478" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://developer.android.com/images/training/lint_icon.png?_=3232996%22%20style=%22border:none;max-width:804px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.15854737226949478',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; outline: none 0px; border-width: initial; border-style: none; width: 20px; height: 20px;">

在Eclipse内使用Lint,它能自动修复一些问题,为问题提供修改建议,直接掉转到问题代码位置。如果你不是用Eclipse开发,也可以使用命令行启动Lint。更多信息请参照tools.android.com.

原文

http://developer.android.com/training/improving-layouts/optimizing-layout.html

分类: android







http://jingyan.baidu.com/article/8065f87fcc50182331249882.html

http://jingyan.baidu.com/article/8065f87fcc50182331249882.html

http://jingyan.baidu.com/article/8065f87fcc50182331249882.html

一直以来 Android 给人的感觉都是各种卡顿,尤其是开的程序比较多以后,和 iPhone 比较起来流畅度上会有不小的差距,实际上我们只要优化得当,Android也能很流畅,丝毫不逊色于 iPhone……

改善 Android 流畅度的方法

本文主要介绍的是从系统优化、第三方软件优化以及设置优化几方面结合来改善 Android 的流畅度

1.系统

刷机

系统这一块绝对是有着举足轻重的地位,一款好的系统能让 Android 脱胎换骨。而从Android  4.1开始,Android 的流畅性可以说有了质的飞跃。Android 4.1的触控感觉非常好,这主要归功于 Android  4.1的帧速度提高到了60fps,而且在触摸延迟上有更加优秀的表现。因此只要情况允许,建议所有 Android 手机都刷到4.1以上,这种体验绝对是以往使用4.0甚至2.3系统都不可想象的。当然,对于大部分 Android 手机来说,4.1还是遥不可及,只有通过第三方 ROM 才能达到品尝“果冻豆”的目的,这里就要特别注意第三方 ROM 的稳定性问题。

改善 Android 流畅度的方法

如果不能刷 Android 4.1,那还可以选择一些第三方 ROM 例如原生系统 AOKP 或者 CM 系列。由于系统非常精简,这些第三方 ROM 也会带来流畅度的提升,当然要放弃的是官方 ROM 的各种自带软件和 UI,这就要看用户的取舍了。

更换内核

Android 手机的内核(Kernel)对手机流畅性也是有很大的影响,内核直接影响 CPU 的运行效率、频率变化。说到刷内核就不能不提超频,一些第三方内核支持 CPU 的超频,CPU 频率提高了流畅度当然会有变化,当然这里也要特别注意温度和电压的控制。

改善 Android 流畅度的方法

CPU的超频

改善 Android 流畅度的方法

2.设置优化

开启性能模式

这个问题在此前的文章“如何让你的手机更省电?”中已经有提及过,很多手机默认是标准模式甚至是省电模式,这对性能是有不少影响的,因此建议不是有特别需求还是调至性能模式(位置:系统设置,因不同手机而异)。

改善 Android 流畅度的方法

关闭动画特效

这是一个 Android 4.0才开始有的设置选项,Android 4.0有两项(窗口动画缩放以及过渡动画缩放),Android 4.1增加了动画程序时长调整。有人说 Android 的动画比较卡,没有iPhone顺滑,有这选项可好,你说动画不顺嘛,我关掉还不行吗?关闭了这些以后会感觉反应迅速了很多,但是牺牲了一定的视觉感受(位置:设置→开发人员选项)。

改善 Android 流畅度的方法

不保留活动

这个选项即把 Android 相对 iPhone 的其中一个很大的优势舍弃了,也就是我们常说的“多任务”,Android 现在的高端机动不动就四核、2G RAM,如果只跑一个软件,可想而知流畅度会非常高,但是这里并不建议使用这种方法提升流畅度,没有多任务的 Android 更像一只三脚猫,如果只是体验一下那种感觉也无妨(位置:设置——开发人员选项)。

改善 Android 流畅度的方法










版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u011904605/article/details/52823521
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:58:14
  • 阅读 ( 915 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢