同样用一张图来展示这个过程。因为Android绘制机制确切有点复杂,所以第一眼看到的时刻你的心坎中可能蹦腾了一万只草泥马😂。不要怕!我们大年夜泉源开端,一点一点的梳理这个看似复杂的绘制机制。为什么说看似复杂呢?因为这个过程只须要几分钟。Just Do It!
CPU、GPU是搞什么鬼的?
成天听到CPU、GPU的,你知道他们是干什么的吗?这里简单的提一下,赞助懂得后面的内容。
在Android的绘制架构中,CPU重要负责了视图的测量、构造、记录、把内容计算成Polygons多边形或者Texture纹理,而GPU重要负责把Polygons或者Textture进行Rasterization栅格化,如许才能在屏幕上成像。在应用硬件加快后,GPU会分担CPU的计算义务,而CPU会专注处理逻辑,如许减轻CPU的包袱,使得全部体系效力更高。
RefreshRate刷新率和FrameRate帧率
RefreshRate刷新率是屏幕每秒刷新的次数,是一个与硬件有关的固定值。在Android平台上,这个值一般为60HZ,即屏幕每秒刷新60次。
FrameRate帧率是每秒绘制的帧数。平日只要帧数和刷新率保持一致,就可以或许看到流畅的画面。在Android平台,我们应当尽量保持60FPS的帧率。但有时刻因为视图的复杂,它们可能就会出现不一致的情况。
如图,当帧率小于刷新率时,比如图中的30FPS < 60HZ,就会出现相邻两帧看到的是同一个画面,这就造成了卡顿。这就是为什愦我们总会说,要尽量包管一帧画面可以或许在16ms内绘制完成,就是为了和屏幕的刷新率保持同步。
下面将会介绍Android是若何来确保刷新率和帧率保持同步的。
【编辑推荐】
- 【拭魅战】Android Data Binding大年夜抵触到爱不释手
- App开辟架构指南(谷歌官方文档译文)
- Android若何编写基于编译时注解的项目
- Android截屏与WebView长图分享经验总结
- iOS大年夜0到1搭建高可用App框架
你可能在游戏的设置中见过Vsync,开启它平日可以或许进步游戏机能。在Android中,同样应用Vsync垂直同步来进步显示机能。它可以或许使帧率FrameRate和硬件的RefreshRate刷新强迫保持一致。
HWComposer与Vsync不得不说的事
WindowManagerGlobal.java
如今来看看前面代码中调用的scheduleFrameLocked()是若何请求一个Vsync旌旗灯号的。
看图啦看图啦。起首在最左边我们看到有个叫HWComposer的类,这是一个c++编写的类。它Android体系初始化时就被创建,然后开端合营硬件产生Vsync旌旗灯号,也就是图中的HW_Vsync旌旗灯号。当然它不是一向一向的在产生,如许会导致Vsync旌旗灯号的接收者一向的接收到绘制、衬着敕令,即使它们并不须要,如许会带来严重的机能损耗,因为进行了很多无用的绘制。所以它被设计设计成可以或许唤醒和睡眠的。这使得HWComposer在须要时才产生Vsync旌旗灯号(比如当屏幕上的内容须要改变时),不须要时进入睡眠状况(比如当屏幕上的内容保持不变时,此时屏幕每次刷新都是显示缓冲区琅绫腔产生变更的内容)。
如图,Vsync的两个接收者,一个是SurfaceFlinger(负责合成各个Surface),一个是Choreographer(负责控制视图的绘制)。我们稍后再介绍,如今先知道它们是干什么的就行了。
Vsync offset机制
为了进步效力,尽量削减卡顿,在Android 4.1时惹人了Vsync机制,并在随后的4.4版本中参加Vsync offset偏移机制。
图1. 为4.1时代的Vsync机制。可以看到,当一个Vsync旌旗灯号到来时,SurfaceFlinger和UI绘制过程会同时启动,导致它们竞争CPU资本,而CPU分派资本会消费时光,着降低体系机能。同时当收到一个Vsync旌旗灯号时,第N帧开端绘制。等再收到一个Vsync旌旗灯号时,第N帧才被SurfaceFlinger合成。而须要显示到屏幕上,须要等都第三个Vsync旌旗灯号。这是比较低效力。于是才有了图2. 4.4版本参加的Vsync offset机制。
图2. Google参加Vsync offset机制后,本来的HW_Vsync旌旗灯号会经由DispSync会分成Vsync和SF_Vsync两个虚拟化的Vsync旌旗灯号。个中Vsync旌旗灯号会发送到Choreographer中,而SF_Vsync会发送到SurfaceFlinger中。理论上只要phase_app和phase_sf这两个偏移参数设置合理,在绘制阶段消费的时光┞菲握好,那么画面就会像图2中的前几帧那样有序流畅的进行。幻想老是好梦的。实际上很难一向保持这种有序和流畅,比如frame_3是比较复杂的一帧,它的绘制完成的时光跨越了SurfaceFlinger开端合成的时光,所以它必须要比及下一?Vsync旌旗灯号到来时才能被合成。如许便造成了一帧的损掉。但即使是如许,如你所见,参加了Vsync offset机制后,绘制效力照样进步了很多。
大年夜图中可以看到,Vsync和SF_Vsync的偏移量分别由phase_app和phase_sf控制,这两个值是可声调节的,默认为0,可为负值。你只须要找到BoardConfig.mk文件,就可以对这两个值进行调节。
回到ViewRootImpl
前面介绍了几个关键的概念,如今我们回到ViewRootImpl中去,在图中找到ViewRootImpl的对应地位。
前面说过,ViewRootImpl控制着一个Window中的┞符个视图树的绘制。那它是若何进行控制的呢?一次绘制毕竟是若何开端的呢?
推荐阅读
当我第一次收到银行发来的“安然”邮件时,我第一反竽暌功就是这里是否有诈?因为在我看来,它实袈溱是太像垂纶邮件了。这封躺在收件箱里的邮件来源竽暌冠我银行经理的小我邮箱地>>>详细阅读
本文标题:用两张图告诉你,为什么你的App会卡顿?
地址:http://www.17bianji.com/lsqh/35508.html
1/2 1