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