Rendering performance is all about how fast you can draw your activity, and get it updated on the screen. Success here means your users feeling like your application is smooth and responsive, which means that you’ve got to get all your logic completed, and all your rendering done in 16ms or less, each and every frame. But that might be a bit more difficult than you think.
In this video, +Colt McAnlis takes a look at what “rendering performance” means to developers, alongside some of the most common pitfalls that are ran into; and let’s not forget the important stuff: the tools that help you track down, and fix these issues before they become large problems.
0
當(dāng)你覺(jué)得自己開(kāi)發(fā)了一個(gè)改變世界的應(yīng)用的時(shí)候,你的用戶可能并不會(huì)這么認(rèn)為,他們認(rèn)為你的應(yīng)用又慢又卡,達(dá)不到他們所期望的那種順滑,更談不上改變這該死的世界了,回收站走你!等等!明明我這個(gè)應(yīng)用在我的Nexus5上非常順滑啊?你咋能說(shuō)又慢又卡呢?如果你對(duì)Android的碎片化有一定了解的話,你就應(yīng)該知道,很多低配置的手機(jī)并不像Nexus5那樣有強(qiáng)大的處理器和GPU,以及沒(méi)有被怎么污染的原生系統(tǒng)。
如果有大量的用戶投訴說(shuō)你的應(yīng)用又卡又慢的時(shí)候,不要總是抱怨用戶的低端手機(jī),有時(shí)候問(wèn)題就出在你的應(yīng)用本身,也就意味著你的Android存在比較嚴(yán)重的渲染性能問(wèn)題。只有真正了解問(wèn)題發(fā)生的根源,才能有效的解決問(wèn)題。所以了解Android渲染相關(guān)的知識(shí),是一個(gè)Android開(kāi)發(fā)者必不可少的知識(shí)。
1
渲染問(wèn)題是你建立一個(gè)應(yīng)用程序是最經(jīng)常碰到的問(wèn)題,一方面,設(shè)計(jì)師希望展現(xiàn)給用戶一個(gè)超自然的體驗(yàn),另一方面,這些華麗的動(dòng)畫(huà)和視圖并不能在所有的Android手機(jī)上都流暢地運(yùn)行。所以這就是問(wèn)題所在。
2
Android系統(tǒng)每16ms都會(huì)重新繪制一次你的Activity,也就是說(shuō),你的邏輯控制畫(huà)面更新要保證最多16ms一幀才能每秒達(dá)到60幀(至于為什么是60幀,這個(gè)后面會(huì)有一個(gè)專(zhuān)題來(lái)講解這個(gè))。如下圖,每一幀都在16ms內(nèi)繪制完成,此時(shí)的世界是順滑的。
但是如果你的應(yīng)用程序沒(méi)有在16ms內(nèi)完成這一幀的繪制,假設(shè)你花費(fèi)了24ms來(lái)繪制這一幀,那么就會(huì)出現(xiàn)我們稱之為掉幀的情況,世界變得有延遲了。如下圖:
系統(tǒng)準(zhǔn)備將新的一幀繪制到屏幕上,但是這一幀并沒(méi)有準(zhǔn)備好,所有就不會(huì)有繪制操作,畫(huà)面也就不會(huì)刷新。反饋到用戶身上,就是用戶盯著同一張圖看了32ms而不是16ms,也就是說(shuō)掉幀發(fā)生了。
3
掉幀是用戶體驗(yàn)中一個(gè)非常核心的問(wèn)題,用戶將很容易察覺(jué)到由于掉幀而產(chǎn)生的卡頓感,如果此時(shí)用戶正在與系統(tǒng)進(jìn)行交互,比如滑動(dòng)列表,或者正在打字,那么卡頓感是非常明顯的。用戶會(huì)馬上對(duì)你的應(yīng)用進(jìn)行吐槽,下一步工作肯定是回收站走你!所以弄清楚掉幀的原因是非常重要的。
不過(guò)蛋疼的是,引起掉幀發(fā)生的原因非常多,比如:
-
你花了太多的時(shí)間重新繪制你視圖中的大部分東西,這樣非常浪費(fèi)CPU周期
Too Much View -
你有太多的對(duì)象堆疊到了一起,你在繪制用戶看不到的對(duì)象上花費(fèi)了太多的時(shí)間
Draw Hidden View -
你有一大堆的動(dòng)畫(huà)重復(fù)了一遍又一遍,導(dǎo)致CPU和GPU組件的大量浪費(fèi)
Too Much Animations
4
檢測(cè)和解決這些問(wèn)題很大程度上依賴于你的應(yīng)用程序架構(gòu),但是幸運(yùn)的是,我們有很多開(kāi)發(fā)者工具來(lái)協(xié)助我們發(fā)現(xiàn)和解決這些問(wèn)題,有些工具甚至能追蹤到具體出錯(cuò)的代碼行數(shù)或者UI控件,這些工具包括但不限于:
-
Hierarchy View
你可以使用Hierarchy View 來(lái)查看你的View是否過(guò)于復(fù)雜,如果是,那么說(shuō)明你有很多時(shí)間沒(méi)有利用。并且浪費(fèi)了許多時(shí)間進(jìn)行重繪。
Hierarchy View 位于Android Device Monitor 中,Android Device Monitor在Eclipse和Android Studio中都有有對(duì)應(yīng)的入口,依次選則Window-Open Perspective-Hierarchy View即可打開(kāi)Hierarchy View視圖。 Hierarchy View視圖雖然比較簡(jiǎn)單,但是非常有效。花費(fèi)一點(diǎn)了解這個(gè)工具每一個(gè)細(xì)節(jié),對(duì)于以后排查問(wèn)題來(lái)說(shuō)都是事半功倍。關(guān)于Hierarchy View視圖的用法,會(huì)有更詳細(xì)的單獨(dú)的教程來(lái)講解。
-
On-Device Tools -- Profile GPU Rendering 、Show GPU Overdraw、GPU View Updates
這三個(gè)選項(xiàng)在設(shè)置-輔助功能- 開(kāi)發(fā)者選項(xiàng)中,默認(rèn)都是關(guān)閉的。Profile GPU Rendering 和 GPU Overdraw比較重要,所以系列視頻后面會(huì)有專(zhuān)門(mén)的專(zhuān)題會(huì)講解,這里簡(jiǎn)單介紹一下GPU View Updates。GPU View Updates的作用是使用GPU進(jìn)行繪圖時(shí)閃爍顯示窗口中的視圖。隨著android版本的更新,越來(lái)越多的繪制操作能使用GPU來(lái)完成,詳見(jiàn)http://developer.android.com/guide/topics/graphics/hardware-accel.html,而這個(gè)工具打開(kāi)之后,使用GPU繪制的區(qū)域會(huì)用紅色來(lái)標(biāo)注,而沒(méi)有紅色標(biāo)注的區(qū)域,則是使用CPU繪制的。這個(gè)選項(xiàng)也可以用來(lái)查看redraw的區(qū)域大小。
-
TraceView
TraceView是一個(gè)很棒的檢查是否掉幀的工具,視頻中沒(méi)有對(duì)此工具進(jìn)行介紹,但是這個(gè)工具非常的重要,他可以找到你代碼中花費(fèi)時(shí)間的地方,精確到每一個(gè)函數(shù),不論這個(gè)函數(shù)是你應(yīng)用程序中的還是系統(tǒng)函數(shù)。另外在Android Studio中,TraceView得到了改進(jìn),其視圖能非常直觀的顯示出每一幀所消耗的時(shí)間,函數(shù)像倒金字塔一般展現(xiàn)在面前,我們可以很容易地看出掉幀的地方以及那一幀里面所有的函數(shù)調(diào)用情況。鑒于此工具非常實(shí)用,所有會(huì)有更詳細(xì)的單獨(dú)的教程來(lái)講解。
5
keep calm, profile your code, and always remember, Perf Matters
6
這是這個(gè)系列視頻的第一個(gè)視頻,從內(nèi)容上來(lái)看,是從一個(gè)大的角度來(lái)看Render Performance,簡(jiǎn)單地講述了一下Render Performance基本的概念,出現(xiàn)的原因以及排查的工具。在發(fā)現(xiàn)問(wèn)題--定位問(wèn)題--解決問(wèn)題的流程上屬于發(fā)現(xiàn)問(wèn)題--定位問(wèn)題,解決問(wèn)題則基本沒(méi)有提到。這也基本符合這一系列視頻的基調(diào):即著重于發(fā)現(xiàn)問(wèn)題(使用工具發(fā)現(xiàn)問(wèn)題、挖掘問(wèn)題出現(xiàn)的原理和原因)和定位問(wèn)題(使用工具定位),如何解決問(wèn)題則需要自己通過(guò)實(shí)戰(zhàn)去進(jìn)行鍛煉,畢竟這種問(wèn)題并沒(méi)有一個(gè)通用的解決方法,每個(gè)應(yīng)用都有每個(gè)應(yīng)用自己的問(wèn)題。