最近聽同事討論硬件加速問題,完全不懂。于是乎,百度了下,原來從3.0開始,安卓開始支持硬件加速,手機(jī)自然是從4.0開始支持的了。而且配置方法一種是在代碼中配置硬件加速,這個(gè)也分很多個(gè)級(jí)別,在minifest中;一種方式是在手機(jī)的開發(fā)人員選項(xiàng)中啟用硬件加速,不過似乎只有g(shù)oogle的nexus有這個(gè)選項(xiàng),其它的手機(jī)都別屏蔽了。 硬件加速的官方文檔:http://developer./guide/topics/graphics/hardware-accel.html 開啟硬件加速有兩種大的途徑 1.在系統(tǒng)設(shè)置“開發(fā)人員……”中勾選啟用GPU加速 2.在應(yīng)用程序中啟用硬件加速 目前遇到的問題有,啟用硬件加速后,WebView的性能受到一定影響,設(shè)置背景透明無效。 目前4.0的系統(tǒng)有硬件加速,之前的版本不太清楚。 我們來看怎樣在程序中啟用硬件加速
這是,Window級(jí)別的硬件加速就啟動(dòng)了。 對(duì)于已經(jīng)在系統(tǒng)設(shè)置項(xiàng)中開啟硬件加速,但是硬件加速會(huì)給應(yīng)用程序帶來問題的情況,可以使用如下方法為應(yīng)用程序View級(jí)別取消硬件加速
這里有篇非常棒的文章: 轉(zhuǎn)載時(shí)請(qǐng)注明出處和作者聯(lián)系方式: http:///archives/%E2%80%9Dhttp://%E2%80%9D mogoweb@gmail.com 本文的主要內(nèi)容來自SDK文章的"Hardware Acceleration”. 從Android 3.0開始,Android的2D渲染管線可以更好的支持硬件加速。硬件加速使用GPU進(jìn)行View上的繪制操作。 硬件加速可以在一下四個(gè)級(jí)別開啟或關(guān)閉:
Application級(jí)別往您的應(yīng)用程序AndroidManifest.xml文件為application標(biāo)簽添加如下的屬性即可為整個(gè)應(yīng)用程序開啟硬件加速: <application android:hardwareAccelerated="true" ...> Activity級(jí)別您還可以控制每個(gè)activity是否開啟硬件加速,只需在activity元素中添加android:hardwareAccelerated屬性即可辦到。比如下面的例子,在application級(jí)別開啟硬件加速,但在某個(gè)activity上關(guān)閉硬件加速。 <application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /></application> Window級(jí)別如果您需要更小粒度的控制,可以使用如下代碼開啟某個(gè)window的硬件加速: getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 注:目前還不能在window級(jí)別關(guān)閉硬件加速。 View級(jí)別您可以在運(yùn)行時(shí)用以下的代碼關(guān)閉單個(gè)view的硬件加速: myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 注:您不能在view級(jí)別開啟硬件加速 為什么需要這么多級(jí)別的控制?很明顯,硬件加速能夠帶來性能提升,android為什么要弄出這么多級(jí)別的控制,而不是默認(rèn)就是全部硬件加速呢?原因是并非所有的2D繪圖操作支持硬件加速,如果您的程序中使用了自定義視圖或者繪圖調(diào)用,程序可能會(huì)工作不正常。如果您的程序中只是用了標(biāo)準(zhǔn)的視圖和Drawable,放心大膽的開啟硬件加速吧!具體是哪些繪圖操作不支持硬件加速呢:
另外還有一些繪圖操作,開啟和不開啟硬件加速,效果不一樣:
Android的繪制模型開啟硬件加速后,Android框架將采用新的繪制模型。基于軟件的繪制模型和基于硬件的繪制模型有和不同呢? 基于軟件的繪制模型在軟件繪制模型下,視圖按照如下兩個(gè)步驟繪制: 1. Invalidate the hierarchy(注:hierarchy怎么翻譯?) 2. Draw the hierarchy 應(yīng)用程序調(diào)用invalidate()更新UI的某一部分,失效(invalidation)消息將會(huì)在整個(gè)視圖層中傳遞,計(jì)算每個(gè)需要重繪的區(qū)域(即臟區(qū)域)。然后Android系統(tǒng)將會(huì)重繪所有和臟區(qū)域有交集的view。很明顯,這種繪圖模式存在缺點(diǎn): 1. 每個(gè)繪制操作中會(huì)執(zhí)行不必要的代碼。比如如果應(yīng)用程序調(diào)用invalidate()重繪button,而button又位于另一個(gè)view之上,即使該view沒有變化,也會(huì)進(jìn)行重繪。 2. 可能會(huì)掩蓋一些應(yīng)用程序的bug。因?yàn)閍ndroid系統(tǒng)會(huì)重繪與臟區(qū)域有交集的view,所以view的內(nèi)容可能會(huì)在沒有調(diào)用invalidate()的情況下重繪。這可能會(huì)導(dǎo)致一個(gè)view依賴于其它view的失效才得到正確的行為。 基于硬件的繪制模型Android系統(tǒng)仍然使用invalidate()和draw()來繪制view,但在處理繪制上有所不同。Android系統(tǒng)記錄繪制命令到顯示列表,而不是立即執(zhí)行繪制命令。另一個(gè)優(yōu)化就是Android系統(tǒng)只需記錄和更新標(biāo)記為臟(通過invalidate())的view。新的繪制模型包含三個(gè)步驟: 1. Invalidate the hierarchy 2. 記錄和更新顯示列表 3. 繪制顯示列表 |
|