《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加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...
随机推荐
- Shell编程-05-Shell中条件测试与比较
目录 Shell脚本条件测试 Shell文件测试 Shell字符测试 Shell整数测试 Shell逻辑测试 Shell条件测试总结 Shell脚本条件测试 在Shell脚本中各种条件结构和流 ...
- linux 各项配置汇总
DNS配置 linux动态地址无需配置DNSlinux配置静态地址时,需要重新设置DNS,DNS的地址为:自己所用网络商的DNS地址,其中DNS地址还分区域例如:电信 江苏南京dns:218.2.13 ...
- Android ContentProvider和Uri详解
一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据, 也就是说你可以通过ContentProvider把应用中的数据共享 ...
- 图片转化为pdf(转)
方法1: 利用Adobe公司的Adobe Acrobat Professional进行转化.注意,一定是Professional版本的,Reader版本没有这个功能. 首先安装Adobe Acrob ...
- linux系统编程之文件与IO(三):利用lseek()创建空洞文件
一.lseek()系统调用 功能说明: 通过指定相对于开始位置.当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置 函数原型: #include <sys/ ...
- (转)(WinForm)FormBorderStyle属性
原地址
- JWT+Log4net配置与使用
Log4net的优点 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.程序运行过 ...
- 适合新手看的ref和out
面试的时候一般很高的概率会问到ref和out的区别...我们死记硬背的话很难记住. 建议大家和我一样简单的探索一下.动手试一下就能记住了. 共同点是我们在使用ref或者out的时候一定要在写的方法里面 ...
- EF 多对多循环引用序列化失败 解决办法
错误:Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.tbldph_901D48A194FB31 ...
- 用MVC5+EF6+WebApi 做一个考试功能(五) 前端主题
内容概述 前面絮絮叨叨没正事,到现在为止也没有开始写代码,不过在考虑下貌似这一节还是开始不了. B/S架构开发有一个特点,就是用浏览器打开,不同的用户群体可能有不同的风格,不论是管理平台还是普通的网站 ...