谷歌官網(wǎng)之硬件加速 【譯】

硬件加速


Android 3.0 (API level 11)開始,Android 2D渲染管道支持硬件加速绩衷。API level >=14的Android系統(tǒng)默認開啟硬件加速蹦魔。由于硬件加速并不支持所有的2D繪制操作,所以開啟硬件加速咳燕,可能會導(dǎo)致自定義view中部分元素看不到勿决,程序拋出異常,或者錯誤的像素渲染等問題招盲。

開啟/關(guān)閉硬件加速

  • Application
    <application android:hardwareAccelerated="true" ...>
  • Activity
<application android:hardwareAccelerated="true">    
  <activity ... />    
  <activity android:hardwareAccelerated="false" />
</application>
  • Window 級別只能開啟硬件加速
getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  • View 關(guān)閉硬件加速
    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

View硬件加速的判斷

兩個方法:

你必須在你繪制代碼(drawing code)內(nèi)檢測低缩,使用前者而不是后者,因為有可能View雖然依附于一個硬件加速的窗口曹货,但它依然可以在一個沒有硬件加速的Canvas上繪制咆繁,列如:為了緩存的目的把view繪制到一個bitmap上。

Android 軟加速/硬加速 繪制模式

基于軟件的繪制模式
繪制步驟:無效從下到上的View顶籽,然后重新繪制玩般。
問題:

  1. 沒有改變的大量上層的View需要重新繪制。
  2. Android重繪view的過程礼饱,有可能沒有繪制發(fā)生改變的view坏为,此時你只能依賴其他view包含恰好的重繪行為。

硬件加速的繪制模式
繪制步驟:

  1. 無效從下到上的View
  2. 記錄和更新顯示列表(display lists)
  3. 繪制顯示列表

優(yōu)點: 使用display lists能有針對性的更新改變的View

不支持的繪制操作


Canvas Scaling

View Layers

Off-screen buffers

所有的Android版本都支持對Off-screen buffers進行渲染镊绪。

你會獲得更好的性能匀伏,當做復(fù)雜view的動畫或者應(yīng)用合成效果時。列如镰吆,當你實現(xiàn)淡出效果時帘撰,你可以使用Canvas.saveLayer(),暫存渲染的view到layer中万皿,然后用透明度合成摧找,使它返回屏幕達到淡出效果核行。

[View.setLayerType()](https://developer.android.com/reference/android/view/View.html#setLayerType(int, android.graphics.Paint))

選擇技巧

  • Performance: 使用硬件加速時,一旦一個view渲染進如layer中蹬耘,只有調(diào)用invalidate()是繪制的代碼才會被執(zhí)行芝雪。一些動畫,列如透明度動畫综苔,可以直接用于layer中惩系,這使用GPU去執(zhí)行是非常高效的。
  • Compatibility: Use a software layer type to force a view to be rendered in software.

View layers and animations

如果你在你的應(yīng)用中跑的動畫沒有達到如筛,你想要的流程結(jié)果堡牡,你可以考慮啟動硬件加速。 以下的屬性杨刨,使用合成來作用于layer晤柄,使用的是優(yōu)化的invalidation及不需要重繪目標view,過程更高效妖胀。

  • alpha: Changes the layer's opacity
  • x, y, translationX, translationY: Changes the layer's position
  • scaleX, scaleY: Changes the layer's size
  • rotation, rotationX, rotationY: Changes the layer's orientation in 3D space
  • pivotX, pivotY: Changes the layer's transformations origin

demo:

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();

提示和技巧

  • 減少view的數(shù)量
  • 避免過度繪制
    A good rule of thumb with current hardware is to not draw more than 2.5 times the number of pixels on screen per frame (transparent pixels in a bitmap count!).
  • 不創(chuàng)建渲染類在繪制代碼中:如在onDraw中 new Paint 或者 Path芥颈。
  • 不頻繁的改變形狀
    Complex shapes, paths, and circles for instance, are rendered using texture masks. Every time you create or modify a path, the hardware pipeline creates a new mask, which can be expensive.
  • 不頻繁的修改bitmap
  • 謹慎使用alpha,當應(yīng)用alpha屬性到很大的views時赚抡,考慮使用 LAYER_TYPE_HARDWARE爬坑。
    .
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涂臣,隨后出現(xiàn)的幾起案子盾计,更是在濱河造成了極大的恐慌,老刑警劉巖肉康,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闯估,死亡現(xiàn)場離奇詭異,居然都是意外死亡吼和,警方通過查閱死者的電腦和手機涨薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炫乓,“玉大人刚夺,你說我怎么就攤上這事∧┑罚” “怎么了侠姑?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箩做。 經(jīng)常有香客問我莽红,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任安吁,我火速辦了婚禮醉蚁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鬼店。我一直安慰自己网棍,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布妇智。 她就那樣靜靜地躺著滥玷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巍棱。 梳的紋絲不亂的頭發(fā)上惑畴,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音航徙,去河邊找鬼桨菜。 笑死,一個胖子當著我的面吹牛捉偏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泻红,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼夭禽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谊路?” 一聲冷哼從身側(cè)響起讹躯,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缠劝,沒想到半個月后潮梯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡惨恭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年秉馏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱羡。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡萝究,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锉罐,到底是詐尸還是另有隱情帆竹,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布脓规,位于F島的核電站栽连,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侨舆。R本人自食惡果不足惜秒紧,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一绢陌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧噩茄,春花似錦下面、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凿菩,卻和暖如春机杜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衅谷。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工椒拗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人获黔。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓蚀苛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玷氏。 傳聞我的和親對象是個殘疾皇子堵未,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 為什么會突然學習硬件加速呢?因為在繪圖的時候盏触,并不是所有的函數(shù)都支持硬件加速渗蟹,我就有一個疑問,硬件加速不是好東西來...
    黑白咖閱讀 14,709評論 2 34
  • 本篇文章是基于谷歌有關(guān)Graphic的一篇概覽文章的翻譯:http://source.android.com/de...
    lee_3do閱讀 7,140評論 2 21
  • 1.1Controlling Hardware Acceleration 從Android3.0(API Leve...
    android之子閱讀 3,867評論 0 11
  • 注:考慮了好久赞辩,還是決定把它發(fā)上來雌芽,希望它可以激勵更多的人。 小時候總是和爸媽吵架鬧獨立辨嗽,而現(xiàn)在不愿意抗的也要自己...
    趙世強故事閱讀 4,765評論 85 268