Android 硬件加速簡介

硬件加速的原理

將view的繪制函數(shù)轉(zhuǎn)化成OpenGL中的函數(shù)來完成繪制靶病。

軟件繪制與硬件繪制的區(qū)別

  • 軟件繪制
    在軟件繪制模式宦搬,view是按照下面兩個步驟進行繪制的:
  1. 無效化View層次結(jié)構(gòu)
  2. 繪制View的層次結(jié)構(gòu)

繪制的特點:
當應(yīng)用需要更新它的一部分UI累驮,它會調(diào)用view的invalidate方法刃鳄,無效化消息就會通過各種途徑傳遞到View的層次結(jié)構(gòu)诅炉,然后計算屏幕中需要重繪的區(qū)域(臟區(qū)域)黑滴,android系統(tǒng)還會對View層次結(jié)構(gòu)中臟區(qū)域相交的所有view進行繪制罢荡。

不足:
1. 這個模式在每一次繪制都需要執(zhí)行大量的代碼赡突,比如,如果你的應(yīng)用對一個button調(diào)用invalidate,而這個button坐標在其他view的上方锣夹,那么android系統(tǒng)就會重繪這些view崩溪,即使他們沒有發(fā)生改變,僅僅因為它們處于和button相交的區(qū)域漱受。
2. 由于一個view的繪制可能導致另一個view重繪,因此會引起一些不被注意到的bug骡送。

  • 硬件繪制
    新的繪制模式包含三個步驟:
  1. 無效化View的層次結(jié)構(gòu)
  2. 記錄和更新顯示列表
  3. 繪制顯示列表

android系統(tǒng)依然使用invalidate和draw函數(shù)來請求屏幕刷新渲染界面昂羡,但實際上繪制的時候是有區(qū)別的,不同于立即執(zhí)行繪制命令摔踱,android系統(tǒng)會先把它們記錄在display list上虐先,這個display lists包含view的層次結(jié)構(gòu)的繪制代碼。其他的優(yōu)化是android系統(tǒng)只需要記錄和更新display lists派敷,通過調(diào)用invalidate函數(shù)來標記那些臟view蛹批,那些沒有被標記為invalidate的view可以簡單的進行重繪通過事先記錄在display list上的記錄。

舉個栗子:
例如篮愉,假設(shè)有一個LinearLayout在Button上面有一個ListView腐芍,那么對于LinearLayout的display list就會像這樣的:
DrawDisplayList(ListView)
DrawDisplayList(Button)
假設(shè)現(xiàn)在你通過調(diào)用setAlpha(0.5)來修改ListView的透明度,那么display list就變成這樣了:
SaveLayerAlpha(0.5)
DrawDisplayList(ListView)
Restore
DrawDisplayList(Button)

關(guān)于ListView的復(fù)雜的繪制代碼并沒有被執(zhí)行潜支,系統(tǒng)只是更新了LinearLayout的display list甸赃,如果應(yīng)用沒有啟用硬件加速,那么listview以及它的父容器LinearLayout的繪制代碼都會再次執(zhí)行冗酿。

硬件加速的優(yōu)勢

  • 流暢性更好:切換到硬件加速埠对,界面固然是更加流暢了络断,但是我們開發(fā)應(yīng)用的時候要想讓GPU的效率更加的高。

  • 性能更好:硬件加速的優(yōu)勢在于display list這個設(shè)計项玛,使用這個的話貌笨,我們就不需要每次重繪都執(zhí)行大量的代碼,因為對臟區(qū)域的襟沮,基于軟件的繪制模式會重繪臟區(qū)域內(nèi)的所有控件锥惋,而display只會更新列表,然后繪制列表內(nèi)的控件开伏。

硬件加速的弊端

  • 消耗更多的內(nèi)存:由于要把系統(tǒng)中OpenGL加載到內(nèi)存膀跌,所以O(shè)penGL API調(diào)用就會占用8MB,而實際上會占用更多內(nèi)存固灵,并且使用了硬件必然增加耗電量了捅伤。
  • 兼容性:硬件加速是從API 11引入,API 14之后才默認開啟巫玻。對于標準的繪制操作和控件都是支持的丛忆,但是對于自定義View的時候或者一些特殊的繪制函數(shù)就需要考慮是否需要關(guān)閉硬件加速。

tips

  • 1.當你的應(yīng)用是硬件加速的仍秤,硬件圖層類型可以傳達更快和更加順滑的動畫熄诡,當你在處理的是一個復(fù)雜的又很多繪制操作的view的時候,運行一個動畫不總是60幀每秒的诗力』烁。可以通過使用硬件層來渲染view到一個硬件的texture中來優(yōu)化這個問題,硬件texture可以用來對view進行動畫姜骡,排除開始動畫的時候需要重繪自己的View导坟,view不會重新重繪除非你改變它的屬性屿良,然后調(diào)用invalidate()圈澈。
    如果你運行一個動畫在你的應(yīng)用上,但是得不到一個你想要的順滑結(jié)果尘惧,考慮啟用硬件加速在你的動畫view上康栈。當view從硬件圖層回退的時候,它的一些屬性會通過圖層合成到屏幕上的方式進行處理喷橙,設(shè)置這些屬性將會更加高效啥么,因為它不需要view重繪或者無效化。
    因為硬件層消耗video存儲贰逾,所以強烈建議啟用它們只有在動畫時長并且關(guān)閉它們當動畫完成的時候悬荣,你可以完成這個通過使用動畫監(jiān)聽器,這一個比較細節(jié)疙剑,但能夠?qū)iew進行優(yōu)化氯迂,畢竟手機內(nèi)存這么少践叠。
    示例代碼應(yīng)該是這樣
View.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
      view.setLayerType(View.LAYER_TYPE_NONE, null);
  }
});
animator.start();
  • 2. 小心使用alpha屬性
    當你使用setAlpha,或者AlphaAnimation嚼蚀,或者ObjectAnimator來改變一個View的透明度時禁灼,它渲染在離屏緩存中需要兩倍填充率,當需要在在一個非常大的view上修改alpha轿曙,就要考慮設(shè)置view的layer type為LAYER_TYPE_HARDWARE弄捕。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市导帝,隨后出現(xiàn)的幾起案子守谓,更是在濱河造成了極大的恐慌,老刑警劉巖您单,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件分飞,死亡現(xiàn)場離奇詭異,居然都是意外死亡睹限,警方通過查閱死者的電腦和手機譬猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羡疗,“玉大人染服,你說我怎么就攤上這事∵逗蓿” “怎么了柳刮?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痒钝。 經(jīng)常有香客問我秉颗,道長,這世上最難降的妖魔是什么送矩? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任蚕甥,我火速辦了婚禮,結(jié)果婚禮上栋荸,老公的妹妹穿的比我還像新娘菇怀。我一直安慰自己,他們只是感情好晌块,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布爱沟。 她就那樣靜靜地躺著,像睡著了一般匆背。 火紅的嫁衣襯著肌膚如雪呼伸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天钝尸,我揣著相機與錄音括享,去河邊找鬼闽铐。 笑死,一個胖子當著我的面吹牛奶浦,可吹牛的內(nèi)容都是我干的兄墅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼澳叉,長吁一口氣:“原來是場噩夢啊……” “哼隙咸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起成洗,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤五督,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓶殃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體充包,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年遥椿,在試婚紗的時候發(fā)現(xiàn)自己被綠了基矮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠场,死狀恐怖家浇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碴裙,我是刑警寧澤钢悲,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站舔株,受9級特大地震影響莺琳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜载慈,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一惭等、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娃肿,春花似錦咕缎、人聲如沸珠十。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙蹭。三九已至晒杈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孔厉,已是汗流浹背拯钻。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工帖努, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粪般。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓拼余,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亩歹。 傳聞我的和親對象是個殘疾皇子匙监,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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