探讨Android 的屏幕滚动操作不如 iPhone 流畅顺滑的原因
其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解决其他一些兼容性问题已经耗费很多精力了,很少有开发者会花很多精力去做细致的性能优化,有的甚至连优化的方向都不知道。现在的官方微博客户端要我看在Overdraw方面还是很严重,然后在异步加载图片的时候帧率也不够稳定,算不上流畅。再则由于Android平台本身机能没有强大到优化烂的应用也能跑的非常流畅暴露了优化不够的事实,特别是手机厂商的定制ROM相比原生系统都一定程度牺牲了一些流畅性导致这个问题显露的更加明显,所以在Android上面作出流畅的应用要付出比iOS更多的精力。
其实Google这些年一直在系统层面作出努力提升系统的UI性能,从硬件加速到Project Butter到Reorder&Merge绘图操作等等,但是我感觉Google对于Android开发最佳实战宣传不够,国内有多少开发者上Youtube看过I/O大会上面的Android Session?几乎每年都有讲关于系统图形性能方面的Session。所以这里面也有国内开发者开发水平和眼界的问题。
综上所述:一是受限于Android平台本身性能不够强大做出相同流畅度的应用比iOS更加困难,二是国内开发者对于Android开发性能优化方面的最佳实践知之甚少。
update:
某些答案中说屏幕触摸反应速度是影响流畅度最大问题的回答并不靠谱。我本身是做Android应用程序开发的,我举一个例子就能质疑这个结论:为什么原生系统(比如运行Android4.4的Nexus5)上面自带的App能运行得丝般顺滑而第3方开发的应用(特别是国内应用)就普遍比较卡?他们的运行环境是一样的吧?屏幕也是一样的吧?为什么流畅度就硬是差一些呢?原因就是SystemApp是Google开发的,他们的开发人员了解如何做出性能优秀的应用,了解Andorid开发的最佳实践。而第3方的开发者水平参差不齐,优化经验不如Google开发人员,导致写出的应用运行效率也不如SystemApp,站在同一个系统和运行环境里面讲,这就是最主要的原因。
上面的一些测试,能反映的最多也只是当手指触摸到屏幕的那个瞬态反应的延迟,并不能完全说明Android不如iOS流畅的原因。我觉得流畅性主要表现再2个方面:一个是触摸反应延迟,一个是渲染的帧率,而且后一个的重要性更大。可以想象一下从手指开始触摸屏幕到UI开始滑动的那100ms的延迟给你造成的不流畅感觉大,还是在滑动过程中不稳定帧率造成的卡顿感觉大?其实Google这些年的Android版本更新也一直致力于改善屏幕触摸延迟(找了个4.4的更新介绍有兴趣的可以看看: Android - 4.4 KitKat ),虽然可能还是比不上iOS,但是我觉得在这方面的差距已经很微小,带来的感受上的差异也是很微妙不容察觉。
更多的不流畅性还是体现在优化烂的应用运行不稳定的帧率上面,比如在某个瞬态后台线程异步加载图片完成后在UI进程执行某个callback方法要显示,如果图片太大就需要根据ScaleType实时缩放到适合的尺寸显示到ImageView上面,这个时候如果图片太大缩放操作时间太长就有可能造成主线程阻塞较长时间,影响了系统UI进程在单位时间片内的渲染,导致掉帧。我再举一个例子也能反驳屏幕触摸反应速度是影响流畅度最大问题的观点:为什么在滑动显示单行文字的列表项一般不会觉得卡,而显示比较复杂布局的列表项(如微博)会比较卡?他们的屏幕和运行环境是一样的吧?触摸延迟都存在吧?为什么呢?这是由于列表项的布局过于复杂,UI控件在整个绘制的过程中(onMeasure()测量大小->onLayout()分配位置->onDraw()绘制)会花费更多的时间,比如各UI控件之间的相对位置和大小可能是互相影响的,这就导致在渲染每一帧的时候需要更多的时间来计算大小和确定位置,然后绘制阶段也需要多执行一些绘图操作来画完所有的UI控件。面对复杂的界面,有经验的开发者会尽量去避免界面的Overdraw(过渡绘制),减少UI层级,选用性能更好的ViewGroup(比如FrameLayout性能比LinearLayout好,LinearLayout性能比RelativeLayout性能好,但是布局能力最强大适应性最好的是RelativeLayout,在功能实现和性能优化中平衡达到最优需要经验),避免图片实时缩放,避免在调用频繁的关键的路径创建对象减少gc频率,合理的管理Bitmap大对象(LruCache)等等(当然还有其他一些优化技巧不在此一一列举了)。还有讲什么进程优先级问题的答案说的也不是最主要的原因,Android的UI渲染进程的优先级可能不是最高但也是比较高的,不会说他UI渲染优先级设置到比后台线程还低的情况,这点不用过度讨论,Google也没蠢到那种地步,不服自己去看Android SDK源代码。
我不否认屏幕触摸延迟也是造成Android滑动感觉不流畅的原因之一,但是站在一个开发者看到的角度来讲,我觉得在现有Android最新版本的系统优化下,他的影响远没有应用优化烂带来的影响大,优化好的Android应用跑在最新的Android版本上基本可以运行的跟iOS应用一样流畅。