android渲染机制
A. 苹果系统到底比安卓好在哪
1、后台机制方面的区别
提到后台,大家应该会很容易想到安卓的真后台了吧,所谓真后台,就是像PC一样,将应用保留在RAM中,当你使用HOME键退出应用,程序实际上并没有完全退出,而是被系统挂在了后台,比如一些聊天软件,之所以关闭后依然能够收到推送,就是因为其常驻系统内存,能够在后台接收到通知,当然,我们平时总能够收到一些垃圾广告的推送,也是因为后台有程序运行。而正是因为有了这样的机制,就导致了一个现象,那就是从内存使用上来看,刚开机的时候内存使用很低,如果不进行清理内存的操作,正常使用一天,内存占用会达到75%以上。而内存占用越高,使用起来流畅度就会越低,所以安卓机器需要更大的RAM来提升用户体验。
而iOS方面,与安卓不同的是,其采用的是伪后台,当程序进入后台会自动变为休眠状态。当你双击Home键呼出多任务管理界面时,你会发现所有的应用卡牌都处于停止状态,iPhone只会默认将应用的最后的运行数据记录在RAM中,而之所以iOS也能够收到推送,是因为当你从应用中选择开启推送之后,系统会增加一些进程,这些进程会从苹果服务器接收信息,然后再通过服务器发给你,苹果服务器在这里是起到了中转的作用。而正是因为有了这一系列的机制,所以即便iPhone的配置相比于同类安卓机低了很多,但是iOS还是会给人更加流畅的感觉。
同iOS一样,WP系统同样采用的是伪后台,也叫做墓碑机制。相比于iOS的后台,WP的后台更加吝啬,永远只能运行一个应用,有人说WP8.1后,WP有了全新的真后台机制,变得不再伪了,可以支持后台上传、后台播放双进程等等,其实这同iOS的后台推送机制相类似,不过是WP对后台进程多做了些优化罢了,正是因为系统对后台进程的严格把控,所以我们看到即便是有着很低内存的WP手机,在使用时也是非常流畅的。
2、渲染机制方面的差别
说过了后台的机制,我们再来说下渲染机制,这一方面也是决定手机流畅度的重要因素,WP系统和iOS系统的UI渲染都采用了实时优先级,而Android的UI渲染则遵循了传统电脑模式的主线程普通优先级,说白了就是前两者追求的是主屏幕显示优先,比如在加载一个复杂网页时,WP系统和iOS系统都会优先加载主屏幕的显示区域,而Android系统则追求了进程优先,同样打开相同的网页,Android手机就会直接将整个网页全部加载同时渲染HTML,这无疑就增加了处理器的压力。
而在其他程序中,用户在使用时其实就能够感觉到,当用户接触到WP手机和iPhone手机的屏幕后,UI线程会拦截所有的事件,系统会将所有资源用于渲染UI的过程中,以保证用户界面的实时渲染优先级。而在Android系统中UI渲染过程的优先级别却没有那么高,也就是说当你触摸Android手机屏幕的时候,系统后台的程序并没有停止,仍然在继续运行之中,比如后台下载,这样系统UI获得的资源就不够,这就是Android系统不流畅的原因。
B. 安卓为什么不采用ios的渲染机制难道是因为内核是linux的所以不能采用类似ios的渲染机制吗
linux的标准其实是跟Unix一样的。
而苹果的系统就是根据Unix的分支BSD进行编制的。
所以不是内核的问题,或者说内核不是主要问题。
应该是因为渲染技术是苹果所有,有版权的原因。
C. 针对Android的性能优化集中哪些方面
一、概要:
本文主要以Android的渲染机制、UI优化、多线程的处理、缓存处理、电量优化以及代码规范等几方面来简述Android的性能优化
二、渲染机制的优化:
大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。
Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。
*关于JobScheler的更多知识可以参考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html
七、代码规范
1)for loop中不要声明临时变量,不到万不得已不要在里面写try catch。
2)明白垃圾回收机制,避免频繁GC,内存泄漏,OOM(有机会专门说)
3)合理使用数据类型,StringBuilder代替String,少用枚举enum,少用父类声明(List,Map)
4)如果你有频繁的new线程,那最好通过线程池去execute它们,减少线程创建开销。
5)你要知道单例的好处,并正确的使用它。
6)多用常量,少用显式的"action_key",并维护一个常量类,别重复声明这些常量。
7)如果可以,至少要弄懂设计模式中的策略模式,组合模式,装饰模式,工厂模式,观察者模式,这些能帮助你合理的解耦,即使需求频繁变更,你也不用害怕牵一发而动全身。需求变更不可怕,可怕的是没有在写代码之前做合理的设计。
8)View中设置缓存属性.setDrawingCache为true.
9)cursor的使用。不过要注意管理好cursor,不要每次打开关闭cursor.因为打开关闭Cursor非常耗时。Cursor.require用于刷cursor.
10)采用SurfaceView在子线程刷新UI,避免手势的处理和绘制在同一UI线程(普通View都这样做)
11)采用JNI,将耗时间的处理放到c/c++层来处理
12)有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右
13)懒加载和缓存机制。访问网络的耗时操作启动一个新线程来做,而不要再UI线程来做
14)如果方法用不到成员变量,可以把方法申明为static,性能会提高到15%到20%
15)避免使用getter/setter存取field,可以把field申明为public,直接访问
16)私有内部类要访问外部类的field或方法时,其成员变量不要用private,因为在编译时会生成setter/getter,影响性能。可以把外部类的field或方法声明为包访问权限
17)合理利用浮点数,浮点数比整型慢两倍
18)针对ListView的性能优化,ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。ListView中getView是性能是关键,这里要尽可能的优化。
getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能
19)不用new关键词创建类的实例,用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。
clone()方法不会调用任何类构造函数。在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
20)public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。
21)乘法和除法
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
22)ViewPager同时缓存page数最好为最小值3,如果过多,那么第一次显示时,ViewPager所初始化的pager就会很多,这样pager累积渲染耗时就会增多,看起来就卡。
23)每个pager应该只在显示时才加载网络或数据库(UserVisibleHint=true),最好不要预加载数据,以免造成浪费
24)提高下载速度:要控制好同时下载的最大任务数,同时给InputStream再包一层缓冲流会更快(如BufferedInputStream)
25)提供加载速度:让服务端提供不同分辨率的图片才是最好的解决方案。还有合理使用内存缓存,使用开源的框架
引用:Android性能优化的浅谈
D. 安卓安卓的后台运行机制和渲染机制为什么不能做到和苹果的一样为什么
因为不是一个商家 就像宝马和法拉利
E. iphone与安卓的运行机制有什么区别为什么ios系统那么流畅andriod为什么达不到ios
首先Android是在虚拟机中运行的 Jaca
Android 没有 iOS 流畅的原因并非 Java GC 导致暂停,也不是因为 Android 运行的是 Java 编译的 bytecode 而 iOS 运行的
native code,根本的原因是,iOS 的 UI 渲染采用实时优先级,而 Android 的 UI
渲染遵循传统电脑模式的主线程普通优先级。
这听起来似乎很抽象和难以理解,但大家可以尝试一下,使用你的 iPad 或者
iPhone,打开 Safari,然后加载一个复杂的网页,例如新浪网首页,当网页加载到一半的时候,把你的手指放在屏幕上,并且四处移动,你会发现所有的渲染立刻停止,在你拿开手指前,网页永远也不会继续加载。
而在 Android 设备上重复这个操作,你会发现,浏览器会继续尝试加载页面并渲染 HTML,试图多任务同时进行,因此对于 Android来说,一个高效的双核处理器是很重要的,这也就是 Galaxy S II 能够非常平滑的原因。
在 iOS 中 UI 渲染过程具有绝对的优先等级,当用户接触到 iPhone 的触摸屏后,iOS 中所有的进程都将停止,UI 线程拦截了所有的事件,系统会将所有资源用于渲染
UI 过程,以保证用户界面的实时渲染优先级。而在 Android 系统中 UI 渲染过程的优先级别却没有那么高,也就是说当你触摸 Android 手机屏幕的时候,系统后台的程序并没有停止,仍然在继续运行之中,比如下载和查收短信,这样系统 UI 获得的资源就不够,这就是 Android 系统不流畅的原因。
由于这个原因,新发布的 Galaxy Nexus,甚至配备四核处理器的话说 EeePadTransformer Prime 平板电脑都无法保证顺滑的操作体验,这些设备只能与 3 年前的 iPhone 顺滑程度相比,那么 Android 团队为什么不从根本解决这个问题呢?
除了 UI 渲染之外,Android 缺乏有效的的硬件加速也是一个原因,在不同的 Android 手机上的硬件加速存在巨大差异,而苹果是唯一一个既做硬件又做软件的手持设备公司,只有苹果可以在硬件中插入对软件的优化,使得基于苹果芯片的设备不仅省电,而且流畅。
实际上,Android 的开发工作在第一代 iPhone 发布之前就已经开始了,原始 Android 原型体被设计成为使用键盘手机的设备,也就是黑莓手机的竞争对手。UI 渲染优先级别在有键盘的手机上并没有那么重要。iPhone 发布之后,Android 小组为了快速推出能与 iPhone 竞争的产品,迅速将 Android 改成触摸屏手机系统,但那时重写 UI 框架已经不可能了。因为如果这样 Android 应用市场中的所有程序将变得不可用,这种关系将一直处于恶性循环之中。
F. 为什么iOS会很流畅
首先,是因为安卓和iOS的渲染机制不同——这也是安卓没有iOS流畅的根本原因。iOS的UI渲染采用的是实时优先级,而安卓的UI渲染是遵循PC模式的主线程普通优先级。简单的说就是,iOS对屏幕反应的优先级很高,用户只要触摸屏幕,系统就会最优先处理屏幕显示这个层级,马上给出动画效果,然后才处理媒体、服务和核心的架构等;而安卓则是追求进程优先,触摸屏幕后的手机屏幕显示和动画效果的优先级放在后面。举个例子:比如安卓手机和iPhone同时打开相同的网页,安卓手机就会直接将整个网页全部加载同时渲染超文本——这无疑是增加了处理器的压力。
在iOS中,UI渲染过程具有绝对的优先等级:当用户接触到iPhone的触摸屏后,iOS中所有的进程都将停止,UI线程拦截所有的事件,系统会将所有资源用于渲染UI的过程,以保证用户界面的实时渲染优先级。而在安卓系统中,UI渲染过程的优先级别却没有那么高,也就是说当你触摸安卓手机屏幕时,系统后台的程序并没有完全停止,而是依然在继续运行中。这就是安卓和iOS在流畅度上差别的最主要原因了。