一、高级优化

    上篇主要从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. iterator取集合元素

    1,完整代码 //创建两个arraylist对象 Collection al = new ArrayList(); //al1添加元素 al.add("name1"); al.ad ...

  2. CSS3的box-shadow

    基础说明:     外阴影:box-shadow: X轴  Y轴  Rpx  color;     属性说明(顺序依次对应): 阴影的X轴(可以使用负值)    阴影的Y轴(可以使用负值)    阴影 ...

  3. asp.net 面试题(附答案)

    这次面试遇到的一些问题有很基础,也有的一些我没有听过.根据经验不同或应聘职位和公司的不同等,遇到的面试问题肯定也不一样.本人两年半asp.net开发经验,这是我年后应聘asp.net工程师遇到的问题, ...

  4. 深入浅出 Cocoa 之 Core Data(3)- 使用绑定

    深入浅出 Cocoa 之 Core Data(3)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...

  5. DIV相对于父DIV底部对齐的实现方法

    代码如下 <style type="text/css"> .box1 {border:1px #cccccc solid; width:500px; height:60 ...

  6. 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

    Here are 15 facts that EVERY GIRL should know about her vagina. Don’t be shy! Your vagina is part of ...

  7. 利用mvn/maven如何检查依赖冲突,并解决依赖冲突

    mvn/maven如何检查依赖冲突,并解决依赖冲突 如图,点击图示位置,就可以把整个项目的依赖关系展示出来 在图里选中一个artifact,则所有依赖该artifact的地方都会一起连带出来突出显示, ...

  8. EasyMvc入门教程-基本控件说明(11)菜单导航

    基本上,是个网站就会有菜单导航,目前流行的菜单是不是这样样子的? 似乎是bootstrap引领的风格,我们就用EasyMvc实现吧,上代码: @{ var data = new List<Men ...

  9. Failed to read artifact descriptor for avalon-framework:avalon-framewor

    在工程中,遇到了这个问题,百度了好久并没有满意的解决方案. 网上有一种办法是: 一.修改.m2/repository/avalon-framework/avalon-framework-api/里所有 ...

  10. json-path解析json方便可靠

    JsonPath is to JSON what XPATH is to XML, a simple way to extract parts of a given document. JsonPat ...