UI 优化系列专题,来聊一聊 Android 渲染相关知识,主要涉及 UI 渲染背景知识、如何优化 UI 渲染两部分内容。
UI 优化系列专题
- UI 渲染背景知识
《View 绘制流程之 setContentView() 到底做了什么?》
《View 绘制流程之 DecorView 添加至窗口的过程》
《深入 Activity 三部曲(3)View 绘制流程》
《Android 之 LayoutInflater 全面解析》
《关于渲染,你需要了解什么?》
《Android 之 Choreographer 详细分析》
- 如何优化 UI 渲染
《Android 之如何优化 UI 渲染(上)》
《Android 之如何优化 UI 渲染(下)》
关于 Android 的渲染,大家肯定听说过每秒 60 帧和 16ms 的限制问题,你是否有想过为什么是这些数字?如果你是对于性能要求较高的开发者,这样的技术细节是非常值得深入了解的。
由于人类眼睛特殊的生理结构,并不像相机那样有图像快照送到大脑;相反,大脑在不停地处理眼睛传递给他的视觉信号,所以对于人类的大脑来说并没有帧或者快照的概念,人类眼睛对于运动的概念来自于静止的帧。
视觉暂留
要了解眼睛是如何感知连续的运动之前,我们先来看一个小实验:
这是一个由纸片剪裁而成的原图,图纸分为 10 个部分,在每部分画上二人舞蹈动作的分解图,中间对应的是猴子跳圈的分解图,整副平面图看上去平平无奇,但是如果把它组装在木杆上旋转起来,神奇视觉效果就会发生:
人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会立即消失,而要延续 0.1 ~ 0.4 秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”。更多小实验可以参考这里。
视觉暂留最早由 1824 年由英国伦敦大学教授皮特.马克.罗葛特提出,物体在快速运动时,当人眼锁看到的影响消失后,人眼仍能继续保留其影像,约 0.1 ~ 0.4 秒左右的图像,这种现象被称为视觉暂留现象。
视觉暂留现象首先被中国人发现,走马灯便是据历史记载中最早的视觉停留运用。物体在快速运动时,当人眼看到影响消失后,眼睛能继续保留其影响,约 0.1 ~ 0.4 秒左右的图像,
其具体应用是电影的拍摄和放映。原因是由神经的反映速度造成的,其时值约为 1/16 秒,对于不同频率的光有不同的视留时间。比如:日常使用的日光灯每秒大约熄灭 100 余次,但我们基本感觉不到日光灯的闪动。这都是因为视觉暂留的作用。要达到最基本的视觉暂留效果至少需要 10 fps。
- 不过关于这一理论也有它的局限性,感兴趣的朋友可以进一步探究。
连续的运动
1. 12 fps
每秒达到 10 ~ 12 帧以上才可以被感知到连续的运动及变化,但是这样的速率是非常不流畅的,只有帧率超过每秒 24 帧的时候,才会被察觉为流畅 的运动及变化。
2. 24 fps
每秒 24 帧在电影界是黄金标准,24 帧的速度足够使画面运动的非常流畅,而且 24 帧的电影预算也能满足成本的需求,这也是为什么在过去的 50 年里,绝大多数的电影都使用 24 帧每秒的速度。
现在,每秒 30 帧对于电影来说戳戳有余,但是对于那些绚丽的电影特效,它的视觉效果还是难以令人信服。
3. 60 fps
实际上每秒 60 帧的速度才是真正的黄金标准,60 帧的速度非常流畅,绝大多数人都察觉不到比 60 帧还高的视觉体验。
16 ms(一帧的工作时间)
现在我们清楚了 60 fps 的由来,下面我们来看下 60 fps 在 Android 渲染中的应用。首先 Android 系统每间隔 16 ms(1000 / 60 ≈ 16ms) 重新绘制一次 Activity 界面。
也就是说应用程序必须要在 16ms 内完成屏幕刷新的全部操作(它是由手机硬件来触发,定义了屏幕每秒的刷新速度),这样才能达到每秒 60fps。
从设计师和产品的角度,他们自然希望应用可以用丰富的图形元素、更炫酷的动画来实现流畅的用户体验。但是 Android 系统很有可能无法及时完成这些复杂界面渲染操作,如果超出一帧的工作时间比如花费 24ms 才完成,这时候就会出现我们称之为掉帧的情况。用户看到同一张画面的时间变长。
丢帧情况下的画面是用户很容易察觉到的卡顿现象。需要说明的是,即使是 40 fps 用户可能也不会感觉到明显的卡顿,但是我们也仍需要做进一步优化,因为我们有更高的要求,希望它能达到流畅画面所需的 60fps。这也是我们要做 UI 优化的目的。
- 卡顿是造成用户口碑差的最核心问题之一,尤其是连续多次出现的掉帧现象更容易被用户察觉到。
以上便是关于为什么是 60fps 的学习和总结,如果你有更好的分析或指正,欢迎你的留言。
文章如果对你有帮助,请留个赞吧。
网友评论