《Android应用性能优化》3——电量、渲染
7、延长电池续航时间
尽管应用有时看起来没做多少事,但实际上可能会很耗电,运行不了多久就会把电量榨干,使设备开机不到半天就没电了。那些被归为“电池杀手”的应用,最终的宿命就是被删除、得差评、不挣钱。因此作为开发者要尽量少用电量,合理使用电池。
在三星GalaxyTab10.1中运行愤怒小鸟作为对比,平板各组件耗电可见一般:

截图中Screen和Wi-Fi分列一二,远超作为游戏的愤怒小鸟。针对这两个组件,设备提供了相应选项让用户对它们的使用方式进行配置。例如,用户可调节屏幕的亮度(手动或根据所显示的图像自动),设定多长时间没有活动后屏幕关闭,屏幕关闭时Wi-Fi也关闭。例如,Wi-Fi连接如果在屏幕关闭后立即断开,那可能只占电池总使用量的百分之几。
7.2 广播接收器
将注册放到onStart(),注销放到onStop()中是最显而易见的做法,为节省更多的电量,通常在onResume()和onPause()中也进行注册与注销
如果需要知道当前电池信息,但不想用通知更新的方式,可调用registerReceiver()并把接收器参数设为null,无须注册任何广播接收器,就能得到包含电池信息的Intent。
测量电池用量,建议在应用启动时获取电池当前电量,运行一段时间,在退出时再次获取电池电量。两电量之间的差异并不表示应用真实的耗电量,因为有其他应用同时在运行,所以需要有更好的方法测量单个应用的耗电量。如,计算出在电池电量耗光前,应用还可运行多久。
为节省电量,应用应避免执行做无用功的代码。
Android定义了应用可使用的5个广播Intent:
- ACTION_BATTERY_CHANGED
- ACTION_BATTERY_LOW
- ACTION_BATTERY_OKAY
- ACTION_POWER_CONNECTED
- ACTION_POWER_DISCONNECTED
上述动作只要有一个发生,应用就会启动(如果它尚未启动)。虽然这可能是期望的行为,但很多情况下,你可能希望应用有不同的处理。例如这种情况,应用在前台运行时显示Toast消息是有意义的;若在后台时还出现Toast消息,就会干扰其他应用,损害用户体验
当应用不在运行或在后台运行时,禁用这些Toast消息,可采用以下两种方法:
- 在应用中加入标记变量,在Activity的onResume()中置为true、在onPause()中置为false,并修改接收器的onReceive()方法,检查标记的值
- 只有当应用在前台运行时才可以启用广播接收器
第一种方法虽可行,但只要动作之一被处罚,应用就会启动。最终会导致执行了不必要的指令,相当于执行no-op(无操作)指令,白白耗费电量。此外,如果应用包含多个Activity,修改标记会影响到多个文件
第二种方法就好多了,因为我们可以确保只有在真正需要时才执行指令,就不会浪费电池电量。为了达到这一目标,我们需要在应用中做两件事:
- 广播接收器默认是禁用的;
- 广播接收器必在onResume()中启用,在onPause()被禁用
7.9 总结
用户通常不会注意到应用是否延长了电池寿命。但是,若不做,更有可能会被注意到。因为单个应用可让所有其他人的努力化为泡影,所有应用都需通力配合,最大限度地延长电池的使用时间。用户会卸载耗电的应用,要合理使用电池,但也应当给用户配置选项的自由,因为不同的用户会有不同的需求。给你的用户配置的权利。
8、图形
8.3 OpenGL ES
纹理压缩
纹理定义了OpenGL ES应用的外观。虽然未压缩的纹理使用起来很方便,但这种纹理会迅速让应用变得冗赘不堪。如,未压缩的256×256的RGBA8888纹理就会占用256KB的内存
未压缩的纹理对性能有负面影响,它们不像压缩过的能够缓存(因为比较小),且还要多次访问内存(影响功耗)。使用未压缩过纹理的应用体积也更为庞大,需要更多的时间来下载安装。此外,Android设备的内存通常是有限的,所以应尽可能占用较少内存。
Mipmap
通常,三维场景中出现在背景的对象,在屏幕上不会占用多少空间。如,屏幕上显示为10×10的对象使用256×256纹理就是浪费资源(内存、宽带)。Mipmap通过提供多层次细节的纹理来解决这个问题。
虽然Mipmap包会比原始图像多用掉33%的内存,但它不仅可提升性能,也会提高图像质量。
纹理如何渲染也取决于选择的那个glTexParameter()方法(比如glTexParamteri())设置的纹理参数。如,可调用glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, param)设置缩小功能,param可取以下值:
- GL_NEAREST
- GL_LINEAR
- GL_NEAREST_MIPMAP_NEAREST
- GL_NEAREST_MIPMAP_LINEAR
- GL_LINEAR_MIPMAP_NEAREST
- GL_LINEAR_MIPMAP_LINEAR
GL_NEAREST一般比GL_LINEAR快,GL_LINEAR又比其他四个更快,越慢的函数得到的视觉质量越好。应用程序会选择什么样的参数可能取决于用户的爱好(加入你提供方法让用户自行配置渲染质量),但许多用户不会有耐心尝试各种配置,找出合适自己设备的组合。因此,应用要自己选出最优的OpenGL配置
多APK
由于可能要支持多种纹理压缩格式(尽可能为每个设备都做优化),Mipmap需占用较大的空间,应用可能会超过Android Market(目前为50M字节)定义的大小限制
若出现这种情况,基本上有三种选择:
- 减少应用的大小,如只支持ETC1纹理压缩;
- 安装应用后从远程服务器下载纹理;
- 生成多个APK,每个对应一套纹理
9、RenderScript
Honeycomb(API等级11)引入了RenderScript,它是一个针对高性能3D渲染和计算操作的新框架。Android2.1(Eclair)后来也引入了这个框架,但Honeycomb是第一个正式将RenderScript公之于众的版本。
RenderScript和NDK都是为了提高应用的性能而引入的。虽然它们有共同的目标,但应仔细斟酌它们的区别。
9.1 RenderScript优点:
- 平台独立(ARM、MIPS、Intel);
- 易于并行执行;
- 可使用CPU、GPU或其他处理器。
9.2 RenderScript缺点:
- Android独有(脚本不能用在其他平台,如IOS);
- 学习难度;
- API数量有限
RenderScript的实际性能测试结果很难得到,它们实在太依赖Android版本和硬件设备了。一些脚本的运行速度可能远超Java或NDK的对应实现,而其他的可能不会。若因为遗留代码的缘故,或这样做更有意义,那么大可在实际中让应用同时使用RenderScript和NDK。
9.3 小结
虽然它似乎仍是Honeycomb带来的略显稚嫩的技术,RenderScript已在Android4.0中有所改善,在将来会更好地发挥硬件的优势。尽管试下ARM是Android移动设备的主要平台,使用NDK时合理的选择,可RenderScript是独立于平台的,这样可显著降低成本,带来巨大的收益。总的来说,RenderScript挺有前景,且很有可能是未来应用的很重要的组成部分,会用在单靠Java不能满足性能需求的地方。
《Android应用性能优化》3——电量、渲染的更多相关文章
- Android应用性能优化(转)
人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...
- android app性能优化大汇总(google官方Android性能优化典范 - 第2季)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- Android APP 性能优化的一些思考
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- android app性能优化大汇总
这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度: 图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...
- 包建强的培训课程(9):Android App性能优化
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Android开发性能优化总结(一)
安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户. 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流. ...
- Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手
图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...
随机推荐
- python socket.error: [Errno 10061]
用Python写server和client时候如果server中sock.bind(('localhost', 8001)) 则client中sock.connect(('localhost', 8 ...
- (最小生成树 )还是畅通工程 -- HDU--1233
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- (匹配 匈牙利)棋盘游戏 -- Hdu --1281
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1281 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 基于Verilog HDL的二进制转BCD码实现
在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数 ...
- codeforces 261B Maxim and Restaurant(概率DP)
B. Maxim and Restaurant time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Chinese Seals
Emperors used seals to proclaim their decrees to their people, officials used seals to exercise thei ...
- 集合(四)HashMap
之前的List,讲了ArrayList.LinkedList,最后讲到了CopyOnWriteArrayList,就前两者而言,反映的是两种思想: (1)ArrayList以数组形式实现,顺序插入.查 ...
- [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现
// 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...
- FP-Growth in Spark MLLib
并行FP-Growth算法思路 上图的单线程形成的FP-Tree. 分布式算法事实上是对FP-Tree进行分割,分而治之 首先,假设我们只关心...|c这个conditional transactio ...
- xlsxwriter
xlsxwriter是python中用来处理execl表格的库 参考