性能優(yōu)化之UI繪制優(yōu)化

UI繪制優(yōu)化

一.CPU與GPU工作流程

? ?cpu:中央處理器(用于計(jì)算)

? ?gpu:圖形處理器(用于顯示)

? CPU 的任務(wù)繁多,做邏輯計(jì)算外,還要做內(nèi)存管理唱矛、顯示操作,因此在實(shí)際運(yùn)算的時(shí)候性能? ? ? 會(huì)大打折扣井辜,在沒(méi)有 GPU 的時(shí)代绎谦,不能顯示復(fù)雜的圖形,其運(yùn)算速度遠(yuǎn)跟不上今天復(fù)雜三維? ? 游戲的要求粥脚。即使 CPU的工作頻率超過(guò) 2GHz 或更高窃肠,對(duì)它繪制圖形提高也不大。這時(shí) GPU? ? 的設(shè)計(jì)就出來(lái)了

黃色的 Control 為控制器刷允,用于協(xié)調(diào)控制整個(gè) CPU 的運(yùn)行冤留,包括取出指令、控制其他模塊的運(yùn)行等树灶;

綠色的 ALU ( Arithmetic Logic Unit )是算術(shù)邏輯單元纤怒,用于進(jìn)行數(shù)學(xué)、邏輯運(yùn)算天通;

橙色的 Cache 和 DRAM 分別為緩存和 RAM 泊窘,用于存儲(chǔ)信息。

從結(jié)構(gòu)圖可以看出像寒, CPU 的控制器較為復(fù)雜烘豹,而 ALU 數(shù)量較少。因此 CPU 擅長(zhǎng)各種復(fù)雜

的邏輯運(yùn)算诺祸,但不擅長(zhǎng)數(shù)學(xué)尤其是浮點(diǎn)運(yùn)算携悯。

60Hz 刷新頻率由來(lái)(1秒60幀圖片,一幀代表一張圖片)

Android 系統(tǒng)每隔 16ms 發(fā)出 VSYNC (垂直同步信號(hào))信號(hào) (1000ms/60=16.66ms) 筷笨,觸發(fā)對(duì) UI 進(jìn)行渲染憔鬼, 如果每次渲染都成功這樣就能夠達(dá)到流暢的畫(huà)面所需要的 60fps 龟劲,為了能夠?qū)崿F(xiàn) 60fps ,這意味著計(jì)算渲染的大多數(shù)操作都必須在 16ms 內(nèi)完成逊彭。

12 fps :由于人類眼睛的特殊生理結(jié)構(gòu),如果所看畫(huà)面之幀率高于每秒約 10-12 幀的時(shí)候构订,就會(huì)認(rèn)為是連貫的

24 fps :有聲電影的拍攝及播放幀率均為每秒 24 幀侮叮,對(duì)一般人而言已算可接受

30 fps :早期的高動(dòng)態(tài)電子游戲,幀率少于每秒 30 幀的話就會(huì)顯得不連貫悼瘾,這是因?yàn)闆](méi)有動(dòng)態(tài)模糊使流暢度降低

60 fps 在與手機(jī)交互過(guò)程中囊榜,如觸摸和反饋 60 幀以下人是能感覺(jué)出來(lái)的。 60 幀以上不能察覺(jué)

變化當(dāng)幀率低于 60 fps 時(shí)感覺(jué)的畫(huà)面的卡頓和遲滯現(xiàn)象

卡頓原理分析

當(dāng)這一幀畫(huà)面渲染時(shí)間超過(guò)16ms的時(shí)候亥宿,垂直同步機(jī)制會(huì)讓顯示器硬件等待GPU完成柵格化渲染操作卸勺,這樣會(huì)讓這一幀畫(huà)面,多停留了16ms甚至更多烫扼,這樣就造成了用戶看起來(lái)畫(huà)面停頓曙求。(也可以理解為丟幀,看電影的時(shí)候映企,有的畫(huà)面出現(xiàn)卡頓灰暗屏就是這個(gè)原因)

二.什么是過(guò)度繪制

GPU的繪制就跟刷墻一樣,一層一層的進(jìn)行悟狱,16ms刷一次,這樣就會(huì)造成圖層覆蓋的現(xiàn)象堰氓,即無(wú)用的圖層還被繪制到底層挤渐,造成不必要的浪費(fèi)。

GPU過(guò)度繪制的幾種情況

1.自定義控件中双絮,onDraw()做了過(guò)多重復(fù)繪制

2.布局層次太深浴麻,重疊性太強(qiáng),用戶看不到的區(qū)域GPU也會(huì)渲染囤攀,導(dǎo)致耗時(shí)增加

過(guò)度繪制查看工具

在手機(jī)端的開(kāi)發(fā)者選項(xiàng)里软免,有OverDraw的監(jiān)視工具,測(cè)試GPU過(guò)度繪制工具焚挠,其中顏色代表渲染的圖層情況或杠,分別代表1層,2層宣蔚,3層向抢,4層

藍(lán)色:過(guò)度繪制一次 無(wú)過(guò)度繪制

綠色:過(guò)度繪制兩次

淡紅:過(guò)度繪制三次

深紅:過(guò)度繪制四次

它們代表了4種不同程度OverDraw情況,我們的目標(biāo)就是盡量減少紅色胚委,看到更多的藍(lán)色區(qū)域

那 Android 系統(tǒng)有沒(méi)有給我們做優(yōu)化的操作呢

CPU 轉(zhuǎn)移到 GPU 是一件很麻煩的事情挟鸠,所幸的是 OpenGL ES 可以把那些需要渲染的紋理 Hold 在 GPU Memory 里面,在下次需要渲染的時(shí)候直接進(jìn)行操作亩冬。所以如果你更新了 GPU 所 hold 住的紋理內(nèi)容艘希,那么之前保存的狀態(tài)就丟失了硼身。在 Android 里面那些由主題所提供的資源,例如 Bitmaps 覆享, Drawables 都是一起打包到統(tǒng)一的 Texture 紋理當(dāng)中佳遂,然后再傳遞到 GPU 里面,這意味著每次你需要使用這些資源的時(shí)候撒顿,都是直接從紋理里面進(jìn)行獲取渲染的丑罪。當(dāng)然隨著 UI 組件的越來(lái)越豐富,有了更多演變的形態(tài)凤壁。例如顯示圖片的時(shí)候吩屹,需要先經(jīng)過(guò) CPU 的計(jì)算加載到內(nèi)存中,然后傳遞給 GPU 進(jìn)行渲染拧抖。文字的顯示比較復(fù)雜煤搜,需要先經(jīng)過(guò) CPU 換算成紋理,然后交給 GPU 進(jìn)行渲染唧席,返回到 CPU 繪制單個(gè)字符的時(shí)候擦盾,再重新引用經(jīng)過(guò) GPU 渲染的內(nèi)容。動(dòng)畫(huà)則存在一個(gè)更加復(fù)雜的操作流程淌哟。為了能夠使得 App 流暢厌衙,我們需要在每幀 16ms 以內(nèi)處理完所有的 CPU 與 GPU 的計(jì)算,繪制绞绒,渲染等等操作婶希。

過(guò)度繪制優(yōu)化(主要減少GPU工作量)

1.減少背景重復(fù)

? ? ? ? ? ? ? ? 注意主題中的設(shè)置:(1)去掉單個(gè)activity的主題設(shè)置的屬性可以在setContentView 之前getWindow().setBackgroundDrawable(null);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)去掉所有activity主題設(shè)置中的屬性直接在styles.xml中設(shè)置<item? ? ? name="android:windowBackground">@null</item>

2.使用裁減減少控件之間的重合部分

三.布局的優(yōu)化(主要減少CPU工作量)

常用工具

Android/sdk/tools/bin/ui automator viewer.bat

Android\sdk\tools\monitor.bat

Device Monitor窗口中Hierarchy view

? ? ? ? ?三個(gè)點(diǎn)也是代表著View的Measure, Layout和Draw。

? ? ? ? 綠: 表示該View的此項(xiàng)性能比該View Tree中超過(guò)50%的View都要快蓬衡;例如,代表Measure的 是綠點(diǎn),意味著這個(gè)視圖的測(cè)量時(shí)間快于樹(shù)中的視圖對(duì)象的50%喻杈。

? ? ? ? 黃: 表示該View的此項(xiàng)性能比該View Tree中超過(guò)50%的View都要慢;

? ? ? ? ?紅: 表示該View的此項(xiàng)性能是View Tree中最慢的狰晚;筒饰。

注意點(diǎn):

1.能在一個(gè)平面顯示的內(nèi)容,盡量只用一個(gè)容器

2.盡可能把相同的容器合并merge

3.能復(fù)用的代碼壁晒,用include處理瓷们,可以減少GPU重復(fù)工作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秒咐,隨后出現(xiàn)的幾起案子谬晕,更是在濱河造成了極大的恐慌,老刑警劉巖携取,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒钳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雷滋,警方通過(guò)查閱死者的電腦和手機(jī)不撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門文兢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人焕檬,你說(shuō)我怎么就攤上這事姆坚。” “怎么了实愚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵兼呵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我爆侣,道長(zhǎng)萍程,這世上最難降的妖魔是什么幢妄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任兔仰,我火速辦了婚禮,結(jié)果婚禮上蕉鸳,老公的妹妹穿的比我還像新娘乎赴。我一直安慰自己,他們只是感情好潮尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布榕吼。 她就那樣靜靜地躺著,像睡著了一般勉失。 火紅的嫁衣襯著肌膚如雪羹蚣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天乱凿,我揣著相機(jī)與錄音顽素,去河邊找鬼。 笑死徒蟆,一個(gè)胖子當(dāng)著我的面吹牛胁出,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播段审,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼全蝶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寺枉?” 一聲冷哼從身側(cè)響起抑淫,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姥闪,沒(méi)想到半個(gè)月后丈冬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甘畅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年埂蕊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了往弓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓄氧,死狀恐怖函似,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喉童,我是刑警寧澤撇寞,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站堂氯,受9級(jí)特大地震影響蔑担,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咽白,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一啤握、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晶框,春花似錦排抬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至侵贵,卻和暖如春届搁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窍育。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工卡睦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔫骂。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓么翰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辽旋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浩嫌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359