資源描述:
《hardware acceleration硬件加速》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、HardwareAcceleration硬件加速HardwareAcceleration從Android3.0(APIlevel11)開始,Android2D渲染管線能更好的支持硬件加速。硬件加速通過(guò)GPU執(zhí)行各種繪畫操作。因?yàn)橛布铀傩枰母嗟馁Y源,所以你的App需要更多的RAM。開啟硬件加速最簡(jiǎn)單的方法是在整個(gè)應(yīng)用全局設(shè)置。如果應(yīng)用只使用標(biāo)準(zhǔn)的View和Drawable,全局設(shè)置不會(huì)產(chǎn)生不利的影響。然而,因?yàn)橛布铀俨恢С炙械?D繪制操作,開啟會(huì)影響一些自定義View或者繪制調(diào)用。問(wèn)題顯示為不可見的元素、異常,或者錯(cuò)誤渲染像素。為了補(bǔ)救這些,Android提供給你選項(xiàng)開啟或者關(guān)閉
2、硬件加速在以下幾個(gè)層面:·Application·Activity·Window·View如果你的應(yīng)用執(zhí)行自定義繪制,開啟硬件加速,測(cè)試應(yīng)用在實(shí)際的硬件設(shè)備上去查找問(wèn)題。控制硬件加速你可以在以下層面控制硬件加速·Application·Activity·Window·ViewApplication層在你的Androidmanifest文件里,添加以下屬性到標(biāo)簽里,針對(duì)整個(gè)應(yīng)用開啟硬件加速:Activity層如果整個(gè)應(yīng)用開啟硬件加速表現(xiàn)的不穩(wěn)定,你也可以針對(duì)單個(gè)Act
3、ivity進(jìn)行控制。在Activity層開啟或者關(guān)閉硬件加速,你可以使用android:hardwareAccelerated屬性在標(biāo)簽內(nèi)。下面是單個(gè)Activity中關(guān)閉硬件加速的例子:Window層如果你需要更細(xì)致的控制,可以在獲得的Window里開啟硬件加速:getWindow().setFlags(WindowManager
4、.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);·注:在window層不能取消硬件加速。View層通過(guò)下面代碼,你可以在運(yùn)行時(shí)關(guān)閉硬件加速:myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);注:你不能在view層開啟硬件加速。View面板有其他方法關(guān)閉硬件加速。更多詳細(xì)內(nèi)容請(qǐng)看View面板。判斷View是否已經(jīng)硬件加速有時(shí)候,知道一個(gè)應(yīng)用當(dāng)前是否硬件加速是非常有用的,尤其像自定義View。這非常有用,
5、當(dāng)你的應(yīng)用做大量的自定義繪制并且不是所有操作都支持新的渲染管道。有兩個(gè)方法查看應(yīng)用是否硬件加速:·View.isHardwareAccelerated()?如果View附屬于硬件加速的窗體,將會(huì)返回true?!anvas.isHardwareAccelerated()?如果Canvas已硬件加速,將會(huì)返回true。如果你一定要在繪制代碼中進(jìn)行這個(gè)查看,請(qǐng)盡可能用Canvas.isHardwareAccelerated()代替View.isHardwareAccelerated()。當(dāng)一個(gè)View附屬于硬件加速窗體,它仍可以通過(guò)非硬件加速的Canvas來(lái)繪制。這種情況,在實(shí)例化時(shí),繪制一個(gè)
6、View到bitmap中,為了緩存目的。Android繪畫模型當(dāng)開啟硬件加速,新的繪畫模型利用顯示列表在界面上渲染你的應(yīng)用。為了完全理解顯示列表和對(duì)你的應(yīng)用有怎樣的影響,知道Android不通過(guò)硬件加速怎么樣繪制View也很重要。下面的篇章闡述基于軟件和基于硬件的繪畫模型?;谲浖睦L畫模型在軟件繪畫模型中,View通過(guò)以下兩個(gè)步驟被繪制:·使層次失效·繪制層次每當(dāng)應(yīng)用需要更新部分UI時(shí),調(diào)用invalidate()(或者它的變形)在任意需要改變內(nèi)容的view里。這些失效信息被傳播始終在view層,計(jì)算需要重繪的界面區(qū)域。然后,Android系統(tǒng)繪制任意view在這些區(qū)域。不幸的是,這種模
7、型有兩個(gè)缺點(diǎn):·第一,這種模型需要執(zhí)行的大量的代碼在每一次繪畫。比如,如果你的應(yīng)用在按鈕里調(diào)用了invalidate()?,而且這個(gè)按鈕在另外一個(gè)view之上,此時(shí)Android系統(tǒng)會(huì)重繪這個(gè)view,即時(shí)它沒(méi)有發(fā)生改變?!さ诙€(gè)問(wèn)題是繪畫模型會(huì)隱藏你應(yīng)用的錯(cuò)誤。從Android系統(tǒng)開始重繪view,當(dāng)他們與臟區(qū)域融合時(shí),你改變的view的內(nèi)容可能會(huì)被重繪即時(shí)invalidate()沒(méi)有被調(diào)用。此時(shí),你依賴于另外一個(gè)vi