Android性能優(yōu)化典范之Render Performance

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)題所在。

Design vs Performance

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í)的世界是順滑的。

Draw Good

但是如果你的應(yīng)用程序沒(méi)有在16ms內(nèi)完成這一幀的繪制,假設(shè)你花費(fèi)了24ms來(lái)繪制這一幀,那么就會(huì)出現(xiàn)我們稱之為掉幀的情況,世界變得有延遲了。如下圖:

Draw Bad

系統(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

你可以使用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

On-Device Tools

這三個(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

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)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容