不少人都反应苹果iPhone要比一般Android手机流畅,这是一个现象要说是大问题谈不上,毕竟两者是完全两个不同的系统所以严格来说放在一起对比是不公平的。不过因为Android以及iOS是当下两大主流操作系统,对比抗衡之类的说法自然难以避免。今天我们就来谈谈为什么iOS产品在使用过程中会让人觉得更加流畅一些,而为何一些Android手机则容易出现卡顿延迟的情况。
一、开发机制不同:安卓机制效率低(划重点)
Android的编程语言是JAVA。Java的内存管理是通过jvm,jvm是后台管理内存,不需要程序关注内存。达到一定的内存占用量会触发gc,gc会stop the world,把用户线程停止掉。因此可能会影响两方面,第一在gc的时候卡顿,特别是full gc。长的可能达到几秒甚至几分钟。而且,gc是后置的。也就是占用内存达到一定程度才回收内存。因为内存使用率很高。
而iOS的Objective-C,编译器gcc,而这个gcc编译出来的代码又被苹果专为iOS架构优化到了极致,运行过程中也不需要虚拟机在中间插手,执行效率自然很高。而且oc使用内存是自己分配和回收的,就是说要操纵指针,使用完内存,自己当时就释放了。
二、系统设计不同:安卓APP无法统一
因为iOS产品的封闭性,所以所有的APP运行对象都比较单一,因为每个应用程序都是被运行在iPhone,iPad等iOS产品当中,它们有着很高的硬件利用效率。因为iOS系统的配件供应商只有那么几家,CPU也是一年换一次,这点不像Android终端年年变月月变,开发者很难遇见未来终端分辨率会包含多少种,GPU驱动会包含哪些等等,所以相对来说Android应用开发成本较高且收益较慢。而iOS应用开发则因为软硬件垂直整合而受益,这样一来苹果自然就保证了应用本身其与硬件产品之间的完美结合程度。
其实Android和iOS两大系统APP开发情况的不同,也正是它们开发和不开放的特性所造成的。如果要是拿旗舰Android手机加上一个专为这款旗舰产品设计的游戏,来和苹果iPhone 5运行对比的话,你真的不会遇到Android旗舰机出现卡顿延迟的问题,为什么因为这款游戏针对这款手机设计,在软硬等方面都达到了最大化的兼容和优化,自然就不会出现停滞的现象。
而Android系统程序要被安装在各种符合要求的手机上面,开发者也不可能针对所有的机器型号进行开发,只能在比较主流的机器上进行测试并保证运行效果,所以他们为了兼顾整个产品线只能不得不降低游戏体验以达到高中低产品可以共用的效果。最后那些占据了Android终端份额的大量大众用户们由于自己的手机不是旗舰产品而得不到流畅的使用体验,自然而然就会产生Android产品不如iOS流畅的抱怨。
三、硬件工作配置不同:iOS基于GPU加速
目前智能手机硬件装备竞赛当中,其实处理器等配置已经达到了一个瓶颈期,各大旗舰产品在硬件比拼当中基本上没有太大的区别,而这时候GPU就成为了一个凸显差异的重要因素。一些大型软件像是3D游戏对GPU性能要求都会比较高,苹果iPhone产品采用的Power VR SGX系列GPU在当下来说非常的主流,跑分测试数据证明了它并不会比一些旗舰级别的Android产品差劲。
而iOS系统对图形的各种特效处理基本上正好都是基于GPU硬件进行加速的,它可以不用完全借助CPU或者程序本身,而是通过GPU进行渲染以达到更流畅的操控表现。但是Android系统产品则并非如此,因为Android需要适应不同的手机硬件,需要满足各种差异配置,所以很多图形特效大多都要靠程序本身进行加速和渲染,并严重依赖CPU运算的操作自然会加大处理器的负荷,从而出现卡顿的问题。虽然Android 4.0以及4.1等更高版本中进行了改进将硬件加速设为默认开启,但依旧无法做到所有特效全部都靠GPU进行加速。在很多Android手机里面都自带有“是否开启GPU渲染”这个功能选项,不过开启之后的改善也是微乎其微。(原文:http://mobile.zol.com.cn/336/3364911_all.html#p3365746)
四、优先级别不同:iOS最先响应屏幕
当我们使用iOS或者是Android手机时,第一步就是滑屏解锁找到相应程序点击进入。而这个时候往往是所有操控开始的第一步骤,iOS系统产品就表现出来了流畅的一面,但Android产品却给人一种卡顿的现象,更别说后续深入玩游戏或者进行其它操控了。这是为什么?
其实这与两个系统的优先级有关,iOS对屏幕反应的优先级是最高的,它的响应顺序依次为Touch--Media--Service--Core架构,换句话说当用户只要触摸接触了屏幕之后,系统就会最优先去处理屏幕显示也就是Touch这个层级,然后才是媒体(Media),服务(Service)以及Core架构。而Android系统的优先级响应层级则是Application--Framework--Library--Kernal架构,和显示相关的图形图像处理这一部分属于Library,你可以看到到第三位才是它,当你触摸屏幕之后Android系统首先会激活应用,框架然后才是屏幕最后是核心架构。
可以看到优先级的不同导致了iOS产品以及Android手机在操控过程中的表现差异,当你滑动屏幕进行操控的时候,iOS系统会优先处理Touch层级,而Android系统则是第三个才响应Library层级,这是造成它们流畅度不同的因素之一。
补充:
随着iOS开发的兴起,Objective-C语言收到了广大移动开发者的青睐。而传统的使用最广泛的语言c++在不同的操作系统、不同的应用平台上继续发挥自己的能量。可以看到,前面两种语言都一个共同的字母—c,毫无疑问预示着c语言相当于这两种开发语言的母亲(不能认为是鼻祖,因为还有汇编、机器语言等)。那么三者的关系与区别到底有哪些呢?
历史:
C:一九七八年由AT&T的贝尔实验室正式发表了C语言。后来由美国国家标准学会ANSI在此基础上制定了一个C语言标准,并于1983年发表,即为ANSI C。
C++:一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
Objective -C:行内人简称其为OC。它的发展主要是因为1988年Steve Jobs的NextStep采用Objective-C作为开发语言,因此MacOS X以及IOS上的开发最佳语言自然也就是Objective-C了。同时Objective-C是苹果Mac OS X 上开发的首选语言,主要是因为Mac OS X 技术源自NextStep的OpenStep操作系统,因为OPENSTEP的软件架构(framework)都是用Objetive-C 写成。然后OC是由Brad Cox在80年代初在第一个纯面向对象语言Smalltalk基础上写成。Brod Cox创立了StepStone公司进行OC语言的推广。最终OC在1992年获得了GNU gcc编译器的支持,因此OC也是GNUstep在Linux和其他平台上的开发语言。
特点:
● C语言特点:
1、作为一种结构化语言,层次清晰,便于按模块化方式组织程序,易于调试和维护;
2、表现能力和处理能力极强。可以直接访问内存的物理地址,进行位(bit)一级的操作;
3、C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体—既可用于系统软件的开发,也适合于应用软件的开发;
4、C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言(主要为演进成了后来的C++)。
● C++语言特点:
1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
2、可以使用抽象数据类型进行基于对象的编程;
3、可以使用多继承、多态进行面向对象的编程;
4、可以担负起以模版为特征的泛型化编程。
● OC语言特点:
1、Objecive-C属于Smalltalk学派,其面向对象与C++面向对象编程力的Simula 67(一种早期面向对象语言)学派不同;
2、Objective-C 是ANSI C的超集,扩展了C 语言使它具备面向对象设计的能力,例如类、消息‘继承;同时在Objective-C的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;
3、Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。
C++与OC同为面向对象设计语言,他们有很多相似的对象,但是由于两者属于不同的面向对象学派。因此两者之间的比较也乐此不疲。下面简要说说他们的区别:
1、继承:Objective-C与同Java和Smalltalk一样不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);
2、函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用
3、定型:Objective-C是动态定型(dynamicaly typed)。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。
4、接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。
5、方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。如下图XCode报错:
PS: Simula67学派主张编程安全,即大部分程序可以在编译时查出,他的支持者声称既然程序设计出色何必再要灵活性,而Smalltalk称为了灵活可以容忍运行时多出错。因此Objective-C和C++的区别就是Objective-C更加灵活而降低了其编译的要求(这个降低并不是说编译就无要求,不会进行类型检查等),而C++提高编译的要求,在编译的过程发现更多的潜在错误,在运行前改正,同时会降低程序的灵活性。因此,在Smalltalk看来正确的程序在Simulr 67那里就无法通过。例如:
对于这行代码:NSString *test =(id) [[NSArray alloc] init];//在编译期间,C++认为是错误的,而OC则认为没有问题。
总之两者的差别主要是因为Objective-C是既支持Dynamic Typing,也支持Static Typing的语言。对于id类型的变量,变量只是一个容器,本身是没有类型的,或者是属于最基本的类型,所以也不需要强制转换。因为编译器不会检查变量的类型是否正确,只是运行时如果类型不正确才会产生异常。 而C++是Static Typing语言,编译时会检查类型,所以必须要加上强制类型转换,否则编译器会报错。 (补充转自:https://blog.csdn.net/spicyShrimp/article/details/62226869)