一、高级优化

    上篇主要从0基础优化的方式,本篇主要将从程序执行性能的角度出发,分析各种经常使用方案的不足。并给出对象池技术、基础数据类型替换法、屏蔽函数计算三种能够节省资源开销和处理器时间的优化策略。

    眼下普遍採用的优化方案有:

    · 优化循环。通过又一次组织反复的子表达式来提高循环体的执行性能

    · 降低使用对象的数量来提高执行性能

    · 缩减网络数据传输来缩短等待时间等

    本篇学习另外三种性能优化的策略:

    1. 採用对象池技术。提高对象的利用率

        Java 中创建和释放对象会占用相当大的资源。採用对象池技术。用来提高对象的利用率

        比如:游戏中敌机处理方式:方法一是游戏载入关卡时候。为每架敌机创建一个对象,这样的方案中创建对象的资源开销巨大。因此严重影响手机游戏的执行性能。方法二是游戏进程中。动态创建敌机对象,被击毁以后将对象设置为null并由System.gc()
回收。

        游戏性能损耗主要在创建和释放对象。而不创建对象又无法实现逻辑功能,因此要尽量避免对象的创建和释放。

        解决方式:依据需求先创建一定量的对象。在须要的创建对象的时候从对象池中申请空暇对象。释放对象时把对象释放回池中,以有效避免由创建和释放对象带来的性能损失

        上例中需求是敌机不超过5架,所以能够使用例如以下代码:

Enemy[5] enemy = new Enemy[5];
for(int i = 0; i<5;i++){
enemy[i] = new Enemy();
}

        在类Enemy 李添加标志属性used 和带參数的 reset 方法使对象可重置到初始状态。在载入游戏关卡的时候初始化对象池,在须要创建对象的时候从对象池获取一个未被使用的对象并使用
reset 方法初始化,须要释放对象的时候仅仅需将标志位改动以供下次使用。

    2. 局部使用基本数据类型取代对象,节省资源开销

    3. 用简单的数值计算取代复杂的函数计算,节省处理器时间

二、 Android 高效开发

    两个基本原则:不要做不必要做的事情。尽可能的节省内存的使用。

    1. 尽可能的避免创建对象。例如以下优化案例:

       ·从原始输入数据中提取字符串时,试着从原始字符串返回一个子字符串,而不是创建一份副本。你将会创建一个新的字符串对象,可是它和你的原始数据共享数据空间。

        ·假设你有一个返回字符串的方法。你应该知道不管怎样返回的结果是StringBuffer。改变你的函数的定义和执行,让函数直接返回而不是通过创建一个暂时的对象。

        ·一个 Int 类型数组要比一个 Integer 类型的数组要好,但相同也能够归纳这样一个原则,两个
Int 类型的数组要比一个 (int, int) 对象数组的效率高得多。

其它基础数据类型也是如此。

       · 两个平行的 Foo[] 和 Bar[] 要比一个(Foo,Bar)
对象数组的效率高得多

        一般来说。我们应该尽可能地避免创建短期的暂时对象。越少的对象创建意味着越少的垃圾回收。这样提高你程序的用户体验质量。

    2. 使用自身方法

        当处理字符串的时候,不要犹豫,尽可能多地使用诸如: String.indexOf()、String.lastIndexOf() 这样对象自身带有的方法。

由于这些方法是用C/C++
来实现的,比Java 循环来的快10~100 倍

    3. 使用虚拟优于使用接口

        假设你有一个 HashMap 对象。你能够申明它是一个 HashMap 或者仅仅是一个 Map。例如以下:

Map myMap1 = new HashMap();
HashMap myMap2 = new HashMap();

        一般来说明智的做法是使用 Map。由于它同意你改变 Map 接口执行上面的不论什么东西,。相对于通过详细的引用进行虚拟函数的调用,通过接口引用来调用会花费2倍以上的时间。

    4. 使用静态优于使用虚拟

        假设你没有必要去訪问对象的外部,那么就使你的方法成为静态。

它会被更快的调用,由于它不须要一个虚拟函数导向表。

调用这种方法不会改变对象的状态。

    5. 尽可能避免使用内在的Get。Set 方法

        虚方法的调用会产生非常多代价,比实例属性查询的代价还要多。

我们应该在外部调用时使用 Get 和 Set 函数,可是在内部调用时。我们应该直接调用。

    6. 缓冲属性调用

for(int i = 0; i < this.mCount; i++){
dumpItem(this.mItems[i]);
}

应该这样写:

int count = this.mCount;
for(int i = 0; i < count; i++){
dumpItem(this.mItems[i]);
}<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> </span>

       一个类似的原则就是:绝不在一个 For 语句中第二次调用一个类的方法。

    7. 申明 Final 常量

static String strVal = "100";
static final String strVal = "100";

       不加 final 编译器会调用一个类初始化方法 <clinit>,这种方法为strVal 在类文件字符串常量表中提取一个引用。加了final就不会调用。由于这些常量直接写入了类文件静态属性初始化中,这个初始化直接由虚拟机来处理。

        将一个类或者方法申明为“final” 并不会带来不论什么执行上的优点。它能够进行一定的最优化处理。假设编译器知道一个Get 方法不能被子类重载,那么它就该把函数设置成
Inline

    8. 慎用增强型 For 循环语句

        在其它收集器里面。增强型 for 循环相当于 iterator 的使用。

    9. 避免列举类型

    10. 通过内联类使用包空间

    11. 避免浮点类型的使用

        嵌入式的处理器通常不支持浮点数的处理。因此全部的 float 和 double 操作都是通过软件进行的。一些主要的浮点数的操作就须要花费毫秒级的时间。

三、Android UI 优化

    1. RelativeLayout 和 LinearLayout 在资源利用上。前者占用更少的资源而达到相同的目的。

        RelativeLayout 须要注意的是内部是通过多个View 之间的关系确定的框架,所以当当中一个View 由于某些须要调用
GONE 来全然隐藏掉以后,会影响与其相关联的Views。 解决方式是使用 alignWithParentIfMissing属性 来解决类型的问题。

    2.  <viewStub />此标签能够使 UI在特殊情况下。直观效果类似于设置 View 的不可见性,可是更大的意义在于被这个标签所包裹的
View 在默认状态下不会占用不论什么内存空间。 viewStub 通过 include 从外部导入 View 元素。

使用方法是通过 android:layout 来指定所包括的内容。默认情况下。 ViewStub 所包括的标签都属于 visibility = GONE。 viewStub 通过方法 inflate() 来召唤系统载入其内部的 View。

<ViewStub
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dp"
android:layout_height="40dp" />

        <include
/>:能够通过这个标签直接载入外部的xml到当前结构中。是复用 UI 资源的经常使用标签。

        <requestFocus
/>
标签用于指定屏幕内的焦点View 。使用方法是将标签至于 View 标签内部

<EditText
android:layout="@layout/mySubTree"
android:layout_width="120dp"
android:layout_height="40dp">
<requestFocus />
</EditText>

        <merge
/> 标签:优化 UI 结构时起到非常关键的数据。目的是通过删减多余或者额外的层级。从而优化整个 Android Layout 的结构。

四、图片优化

    1. 图片压缩

        图片缩小的操作是删除部分像素点,小图放大则要人为地加入一些像素点。图片放大不总是成倍的。在移植到不同的手机时能够先用菜单画布界面
getWith() 以及 getHeight() 取得当前手机屏幕的宽度和高度,假设当前图片不够满屏显示就对图片进行放大。相反则缩小。

也能够自己定义屏幕显示图片的大小。如在屏幕上显示多张图片的缩略图,使图片方式的显示更加丰富。

    2. 降低图片容量

        · 将多张图片集成到一张图片上。

由于省去了多张图片的文件头、文件结束数据块等。并且合并了调色板

        · 降低图片的颜色数

欢迎转载,转载注明出处,谢谢
Mr.傅:阅读自《Android应用开发揭秘》

Android学习之——优化篇(2)的更多相关文章

  1. Android学习之——优化篇(1)

    一.优化的品质 1.简练.2.可读性强.3.模块化:4.层次性:5.设计良好.6.高效.7.优雅:8.清晰. 二.常见的编程规范     1. 基本要求 · 结构清晰,简单易懂.单个函数不超过100行 ...

  2. Android学习笔记(第二篇)View中的五大布局

    PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Act ...

  3. Android学习笔记(第一篇)编写第一个程序Hello World+Activity

    PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序..   学习Android,那么就需要有一个编译器来集 ...

  4. android学习笔记(入门篇)

    +号只是当你第一次定义一个资源ID的时候需要, 告诉SDK此资源ID需要被创建出来 对于所有的View默认的权重是0,如果你只设置了一个View的权重大于0,那么这个View将占据除去别的View本身 ...

  5. 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)

      1.什么是蓝牙  Bluetooth是目前使用的最广泛的无线通讯协议之一  主要针对短距离设备通讯(10米)  常用于连接耳机.鼠标和移动通讯设备等 2.发现周围蓝牙设备  BluetoothAd ...

  6. 《Android学习指南》目录

    源:<Android学习指南>目录 Android学习指南的内容分类: 分类 描述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这 ...

  7. 《Android学习指南》文件夹

    转自:http://android.yaohuiji.com/about Android学习指南的内容分类: 分类 描写叙述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不 ...

  8. 【转】Android性能优化之布局优化篇

     转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...

  9. (转)Android之ListView原理学习与优化总结

    转自: http://jishu.zol.com.cn/12893.html 在整理前几篇文章的时候有朋友提出写一下ListView的性能优化方面的东西,这个问题也是小马在面试过程中被别人问到的….. ...

随机推荐

  1. dedecms跳转标签

    我们在使用织梦dedecms制作网站的时候,有时会遇到利用arclist和list标签调用redirecturl属性.但是,dedecms的arclist和list标签不支持redirecturl.很 ...

  2. WPF文字渲染相关的问题及解决

     wpf中常常遇到各种和文字渲染有关的问题. 如今列举下现象和解决方式. (1) 现象: 文字大小不一.不在同一水平线. 不同字渲染成同一个字, 或者字体发虚 原因:微软雅黑字体对中文字符的渲染支 ...

  3. Git历险记(四)——索引与提交的幕后故事

    我想如果看过<Git历险记>的前面三篇文章的朋友可能已经知道怎么用git add,git commit这两个命令了:知道它们一个是把文件暂存到索引中为下一次提交做准备,一个创建新的提交(c ...

  4. dubbo服务接口开发者必备调试利器,你值得拥有

    dubbo服务接口开发者必备调试利器,你值得拥有 学习了:https://my.oschina.net/vboxtop/blog/1524290 找到了:http://www.vbox.top/?fr ...

  5. VS2010 + C#4.0使用 async + await

    方法一: 安装官方出的Microsoft.Bcl.Async包 最新发布日期为 2014/4/12,版本1.0.168 (不支持VS2010) 1.解决方案-右键-管理解决方案的NuGet程序包 2. ...

  6. 移动端开发者福利-免费收费api收藏

    一 .api 1.https://www.juhe.cn/ 跟百度api集市差不多,超级赞,做好认证就行了,我有20+认证能用的免费api 2.http://apistore.baidu.com/as ...

  7. 又一次认识java(九) ---- 内部类

    注意注意!! ! 前排提示!!.本篇文章过长,最好收藏下来慢慢看.假设你之前对内部类不是非常熟悉,一次性看完,大概你会懵逼. . . 1. 内部类概述 一个类的定义放在还有一个类的内部,这个类就叫做内 ...

  8. java:注解(一)

    什么是注解 注解(Annotation),也叫(metadata)元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法. ...

  9. c# using三种用法

    http://www.cnblogs.com/fashui/archive/2011/09/29/2195061.html http://www.cnblogs.com/iamv/archive/20 ...

  10. css:选择器

    http://blog.csdn.net/xyz121323693/article/details/8516297 交集选择器 并集选择器 后代选择器 子代选择器 http://www.cnblogs ...