首页 今日头条正文

一夜又一夜打一字,Android 功能优化之烘托原理,g2

先一个大一个力是什么字来看几个概念

fps:每秒传输的帧数,FPS”也能够理解为咱们常说的“改写率(单位为Hz)”。

hz:代表屏幕在一秒内改写的次数,Android手机一般为60HZ,也便是一秒改写60帧,大约16.67ms改写一次

丢帧:原本一秒中画面需求更新 60 帧,可是假设这期间只更新了 55 帧 , 那么在用户看来便是丢帧了 , 片面感觉便是卡了

tearing: 一个屏幕内的数据来自2个不同的帧,画面会出现撕裂感

jank: 绘图速度过慢,一个帧在屏幕上接连出现2次

lag:从用户体会来一夜又一夜打一字,Android 功用优化之烘托原理,g2说,便是点击下去到出现作用之间存在推迟

撕裂(screen tearing):当cpu/gpu将数据预备写入buffer(缓冲区)中,但display还没来的及显现,这时cpu/gpu把下一帧数据往buffer写,还没写完,Display开端读去buffer显现,(也便是绘图数度大于显现速度),这是就会出现显现的上半部分为下一帧数据,下半部分为上一帧数据,如图所示,这便是撕裂。

tearing发作的原因是display读buffer一同,buffer被修正,那么多一个buffer是不是能处理问题,这个时分双缓冲就诞生了。

双缓冲机制

从功用视点动身,假设只对一块缓冲区进行读写无疑功率比较低下:一方面屏幕要从该区域去读,另一方面显卡要等候去写.因此在实践中,其实帧缓冲区实则被划分为两部分:

前缓冲区: 用来缓存要显现到屏幕的帧数据 后缓冲区: 用来缓存显卡生成的帧数据. 屏幕只能前缓冲区读取数据用于显现,显卡只能往后缓冲区写入新生成的帧数据.需求留意的是两块缓冲区并不发作实践上的数据复制操献组词作,行将后缓冲区的帧数据复制到前缓冲区,而是在前缓冲区的帧数据现已推到屏幕上,且新的帧数据被写入到后台缓冲区后,进行指针交流操作,将本来的后缓冲区变为前缓冲区

但仍是有问题,假设是backbuffer预备完结一帧数据今后就进行,那么假设此刻屏幕还没有完好显现上一帧内容的话,肯定是会出问题的。看来只能是比及屏幕处理完一帧数据后,才能够履行这一操作了. 当扫描完一个屏暗地,设备需求从头回到榜首行以进入下一次的循环,此刻有一段时刻空地,称为VerticalBlanking 腾晓东新浪微博Interval(VBI)。咱们应squirter该能想到了,这个时刻点便是咱们进行缓冲区交流的最佳时刻。因为此刻屏幕没有在改写,也就防止了交流进程中出现 screentearing的状况。VSync(笔直同步)是Ve晓入寒铜觉rticalSynchronization的简写,它运用VBI时期出现的vertical sync pulse来保证双缓冲在最佳时刻点才进行交流。 所以说V-sync这个概念并不是Google创始的,它在早些年前的PC机范畴就现已出现了。不过Android 4.1给它赋予了新的功用,稍后就能够看到。

Android显现原理

在一个典型的显现系统中分为GPU,CPU,Display(有些言辞称为显现器)三部分,And一夜又一夜打一字,Android 功用优化之烘托原理,g2roid中LayoutInflater将布局中的xml标签转换为目标,cpu通过核算将它转化为多边形(Polygons)或Texture(纹路)。gpu对多边形或许纹路进行栅格化(Rasterization)操作,栅格化后的数据写入帧缓冲区中等候显现器显现。如图:

安卓在4前园希美.1做的优化(P篮导航roject妃常淡定废材女玩棋迹 Butter 黄油计划)

在Android 4.1之前,界面卡顿是Android中最受诟病的一点.为了处理界一夜又一夜打一字,Android 功用优化之烘托原理,g2面卡顿问题,Go僵尸夜总会ogle为Android引进了Project Butte林宇宾r计划,即常说的黄油计划.在该项目中,Google对Android显现系一夜又一夜打一字,Android 功用优化之烘托原理,g2统进行重构,并引进了三个至关重要的改善:

VSync增强:VSync不仅仅用于防止画面撕裂现象,现在它还会告诉GPU在烘托下一帧之前要等候屏幕完结 逐行制作.

Triple Buffer: 三缓冲机制

Choreographer: 用于协同nimations,input和drawing一同作业

双缓冲意味着要运用两个缓冲区(SharedBufferStack中),其间一个称为Front Buffer,别的一个称为Back Buffer。UI总是先在B方钊ack Buffer中制作,然后再和Front Buffer交流,烘托到显现设备中,其间Display处理前Front Buffer,CPU、GPU处理B一夜又一夜打一字,Android 功用优化之烘托原理,g2ack Buffer

需求留意的是Andr一夜又一夜打一字,Android 功用优化之烘托原理,g2oid中一向存在VSync机制(有待考证),只不过前期VSync仅仅为了防止画面撕裂(screen tearing)现象.为了更好的了解增强过的VSync和Triple Buffer,咱们先来看一下前期图画显现的进程,即VSy禁片排行nc只用来防止画面撕裂的状况:

这个图中有三个元素,Display是显现屏幕,GPU和CPU担任烘托帧数据,每个帧以方框表明,并以数字进行编号,如0、1、2等等。VSync用于辅导双缓冲区的交流。以时刻的次序来看下将会发作的反常:

  1. Display显现第0帧数据,此刻CPU和GPU烘托第1帧画面,而且赶在Display显现下一帧前完结。
  2. 因为烘托及时,Display在第0帧显现完结后,也便是第1个VSync后,正常显现第1帧。
  3. 因为某些原因,比方CPU资源被占用,系统没有及时地开端处理第2帧,直到第2个VSync快来前才开端处理
  4. 第2个VSync来时,因为第2帧数据还没有预备就绪,显现的仍是第1smd117帧。这种状况被Android开发组命名为“Jank”。
  5. 当第2帧数据预备完结后,它并不会立刻被显现,而是要等候下一个VSync。所射天角以总的来说,便是屏幕无缘无故地多显现了一次序1帧。原因咱们应该都看到了,便是CPU没有及时地开端着刘良芳手处理第2帧的烘托作业,致使“延误军机”。

其实总结上面的这个状况之所以发作,首要的原因就在于第二帧没有及时的制作。那么怎样使得第二帧及时被制作呢?这便是咱们在Graphic系统中引进VSYNC的原因,

CPU/GPU依据VSYNC信号同步处理数据,能够让CPU/GPU有完好的16ms时刻来处理数据,削减了jank。假设CPU/GPU的FPS(FramesPer Second)高于这个值,那么这个计划是完美的,显现作用将很好。 总结,vync同步使得CPU/GPU充分运用了16ms时刻,削减jank

Triple Buffer

在双缓存的基础上,android又引进了三缓存技能。 首要来看传统的双缓冲机制,抱负状况下,其作业状况如下:

在上图中,以GPU一行为例,长方形A和B别离代表两块缓冲区域,别离代表前台缓闫荣磊冲区和后台缓冲区.开端时A作为前台缓冲区,此刻GPU会想后台缓冲区B写入帧数据;当B缓冲区预备就绪后,A,B交流,B变成前台缓冲区,A变成后台缓冲区,全部都很流程,CPU/GPU充分运用每个16.6ms,在前一个VSync到来时开端预备数据,并在后一个VSync到来时预备好数据.但问题时,咱们无法保证CPU/GPU都能在16.6ms内能够预备好数据铭铭胶水(l或许设备较差,或许界面你叫杂乱,cpu/gpu无法在16秒内处理好数据导致交流推迟)

当CPU/GPU的处理时刻超越16ms时,榜首个VSync到来时,缓冲区B中的数据还没有预备好,所以只能持续显现之前A缓冲区中的内容。而B完结后,又因为缺少VSync pulse信号,它只能等候下一个signal的降临。所以在这一进程中,有一大段时刻是被糟蹋的。当下一个VSync出现时,CPU/GPU立刻履行操作,此刻它可操作的buffer是A,相应的显现屏对应的便是B。这时看起来便是正常的。只不过因为履行时刻依然超越16ms,导致下一次应该履行的缓冲区交流又被推迟了——如此循环反复,便出现了越来越多的“Jank”。

很显然,榜首次的Jank看起来是没有办法的,除非晋级硬件装备来加速FPS。咱们重视的重点是被CPU/GPU糟蹋的时刻段,怎样才干充分运用起来呢?Google为了处理该问题,引进的三缓冲机制,即在本来双缓冲的机制上加入了第三块缓冲区.

咱们来逐渐剖析下这个是否有用。首要和预料中的共同,榜首次“Jank”无可高叉比基尼厚非。不过让人欣喜的是,当榜首次VSync发作后,CPU不必再等候了,它会运用第三个buffer C来进行下一帧数据的预备作业。尽管对缓冲区C的处理所需时刻相同超越了16ms,但这并不影响显现屏——第2次VSync到来后,它挑选buffer B进行显现;而第3次VSync时,它会接着选用C,而不是像double buffering中所看到的状况相同只能再显现一遍B了。这姿态就有用地降低了jank。可是带来了lag的问题,如上图所示,A这一帧在第4个一夜又一夜打一字,Android 功用优化之烘托原理,g2vsync来的时分才显现,假设是双缓冲,那在第三个vynsc就能够显现了。

三缓冲作用: 简略的说在2个缓存区被GPU和display占有的时分,拓荒一个缓冲区给CPU用,一般来说都是用双缓冲,需求的时分会敞开3缓冲,三缓冲的优点便是使得动画更为流程,可是会导致lag,从用户体会来说,便是点击下去到出现作用会有推迟。所以默许不开三缓冲,只要在需求的时分主动敞开 一句话总结三缓冲有用运用了等候vysnc的时刻,削减了jank,可是带来了lag

总结: VSync(处理画面撕裂10658830) 三缓冲(提高CPU/GPU运用率)

谷歌供给了这么牛逼的机制,为什么你写的APP还会卡? 1.界面太杂乱。 2.主线程太忙。他或许还在处理用户交互或许其他工作。

最终

漫漫开发之路,咱们仅仅其间的一小部分……只要不断的学习、进阶,才是咱们的出路!才跟得上年代的前进!

今年年初我花一个月的时刻录入收拾了一套常识系统,假设有主意深化的系统化的去学习的,能够私信我【安卓】,我会把我录入收拾的材料都送给咱们,协助咱们更快的进阶。

重要的事说三遍,转发+转发+转发,让更多需求的朋友们都能够看到而且领到!

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。