Android中GPU硬體加速控制及其在2D圖形繪製上的侷限
圖形的渲染可分為兩種:軟體渲染和硬體渲染。軟體渲染是靠CPU計算各種座標並繪製,主要是佔用記憶體;硬體渲染是靠GPU,主要佔用視訊記憶體,一般的3D圖形程式(OpenGL、DirectX)都是GPU加速的。
在Android3.0之前,2D繪圖API只支援軟體渲染模式,從Android3.0開始,2D繪圖API開始支援GPU硬體渲染,即View中的Canvas的繪圖操作會使用GPU,所以從Android 3.0(API Level 11)開始,View中就多了一些和硬體相關的方法。如果App的AndroidManifest.xml檔案中定義的 targetSdkVersion大於或等於14(Android 4.0),那麼Android會預設為App啟用GPU渲染2D圖形,我們也可以自己決定是否使用GPU,見下文。如果開啟了GPU硬體加速,那麼Android會用OpengGL繪圖中常見的Display List技術對OpenGL ES中的繪圖命令進行快取,提高繪圖效率與速度。關於Android中GPU硬體加速的Display List繪圖機制會在以後專門寫文章進行闡述,本文不做過多介紹。
控制是否使用GPU
我們也可以顯式地啟用或禁用GPU渲染,並且可以從多個Application、Activity、Window、View多個級別對其進行控制。
Application
在AndroidMenifest.xml的中新增如下的屬性即可在整個App的所有Activity的View中啟用GPU硬體加速渲染2D圖形:
<application android:hardwareAccelerated="true" ...>
Activity
你既可以在Application級別上控制GPU是否啟用,也可以在Activity級別對其就進行控制。比如你的App中有多個Activity,你想讓大部分Activity啟用GPU硬體加速,但有一個Activity你不想啟用硬體加速,你可以通過以下的配置實現:<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
Window
如果你想要更加細粒度地對GPU的使用進行控制,你可以通過程式碼對指定的Window啟用GPU硬體加速,如下程式碼所示:getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
需要注意的是在執行時不能通過程式碼禁用掉某個Window的硬體加速。
View
你也可以在執行時通過如下程式碼為某個指定的View禁用掉GPU硬體加速:if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ //View從API Level 11才加入setLayerType方法 myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
View從API Level 11才加入setLayerType方法,所以在使用前需要判斷一下當前系統執行的版本。 需要注意的是,在執行時不能通過程式碼為某個View啟用GPU硬體加速。
判斷當前是否處於硬體加速中
從Android 3.0(API Level 11)開始,View和Canvas類都加入了isHardwareAccelerated()方法,可以用於判斷當前View和Canvas是否處於硬體加速中。
View.isHardwareAccelerated()
如果View的isHardwareAccelerated()方法返回true,僅僅表示該View被加入到一個處於硬體加速的Window中,其有可能仍然使用一個非硬體加速的Canvas進行實際的渲染。所以,通常來說View的isHardwareAccelerated()方法實際用處不太大。Canvas.isHardwareAccelerated()
我們在View的onDraw回撥方法中可以得到Canvas物件,如果Canvas的isHardwareAccelerated()方法返回true,那麼表示當前Canvas是用GPU硬體加速渲染的,如果返回false就表示是用軟體渲染的。通常,判斷當前Canvas是否處於GPU硬體加速中對於繪製自定義的View來說比較重要,下面會解釋。
硬體加速時2D圖形繪製的侷限
開啟GPU硬體加速會提升程式的繪圖效率,但是也存在一定的侷限性。
啟用GPU硬體加速會增加記憶體的使用。
Android中有些2D繪圖API在GPU硬體加速時不能使用或者要到某個指定的版本才能使用。
Canvas
以下為Canvas中在GPU硬體加速時受限制的功能:
第一列是受限制的方法,第二列是開始支援的API Level,紅叉代表到目前還不支援。
Paint
以下為Paint中在GPU硬體加速時受限制的功能:
Xfermode
以下為Xfermode在GPU硬體加速時受限制的功能:
Shader
以下為Shader在GPU硬體加速時受限制的功能:
Canvas縮放
Android中硬體加速的2D渲染管線最初只支援無縮放的繪圖,這會導致在將縮放比例設定為很大的時候,繪圖質量會明顯降低。最初,GPU加速下的2D繪圖操作會被渲染成一個縮放比例為1.0的紋理,然後GPU會將它縮放到指定比例尺。在API Level小於17的時候,隨著縮放比例scale的變大,繪圖質量就更加難以保證。下面的表格表示了從什麼版本開始Android能在GPU硬體計算下正確處理2D圖形的大比例縮放問題:
現在我們開發的App一般將targetSdkVersion寫為最新版本,肯定大於API Level 14了,並且市場上的手機絕大部分都是Android 4.0以上的,所以我們現在開發的App預設情況下在絕大部分手機上基本都是預設開啟了GPU硬體加速的。如果我們自己要自定義一個View,我們要重寫其onDraw方法,通過呼叫各種繪圖方法實現複雜的效果,但是如果我們呼叫的API在GPU硬體加速下不支援的話,就畫不出我們想要的效果,舉個例子,比如我們想在自定義View中繪製一個具有模糊效果的橢圓,需要呼叫畫筆Paint的setMaskFilter()方法,但是我們通過上面的受限API列表可以發現,在GPU硬體加速下,Pait的setMaskFilter()方法不被支援,雖然呼叫不報錯,但是不會起到任何效果。為了畫出我們想要的效果,我們可以通過View的setLayerType(View.LAYER_TYPE_SOFTWARE, null)方法單獨把我們的View禁用掉GPU硬體加速,這樣在軟體渲染模式下所有的2D繪圖API都可以正常使用了。
最後有點需要說明,上述Android在GPU硬體加速下2D圖形繪製API存在的侷限問題是基於當前最新API Level 23的,隨著以後更新Android版本的釋出,可能上述受限API會逐漸在GPU下得到更好的支援。
希望本文對大家初步瞭解Android中GPU硬體渲染2D圖形有所幫助,後面會寫文章深入探討Android在GPU硬體渲染下繪製2D圖形的Display List機制。
相關文章
- WPF基礎:在Canvas上繪製圖形Canvas
- Android硬體加速(二)-RenderThread與OpenGL GPU渲染AndroidthreadGPU
- 繪製圖形
- Android OpenGL ES 開發(二):繪製圖形Android
- Cypress 架構及其決定的侷限架構
- java:繪製圖形Java
- matplotlib繪製圖形
- 硬體加速gpu計劃開還是不開 win10硬體加速gpu計劃有用嗎GPUWin10
- CAD有趣圖形的繪製
- 高階圖形繪製軟體的原理猜想
- css繪製特殊圖形CSS
- 使用css繪製圖形CSS
- win10硬體加速沒有gpu計劃 強制開啟win10硬體加速gpu計劃的方法Win10GPU
- Excalidraw:繪製圖形的新利器
- 如何用 GPU硬體層加速優化Android系統的遊戲流暢度GPU優化Android遊戲
- 分段函式圖形繪製函式
- Shader 繪製基礎圖形
- [C#] 在控制檯繪圖, 如:放置影像, 繪製線條C#繪圖
- Python例項:僅繪製圖例而不繪製實際的圖形Python
- Windows10系統中edge怎麼設定硬體加速GPUWindowsGPU
- MATLAB圖形繪製練習(一)Matlab
- [譯] 繪製路徑:Android 中向量圖渲染Android
- 銳龍7000系列將整合GPU:不再侷限於APUGPU
- VC++儲存繪製的圖形-1C++
- Python 在PDF中繪製線條、矩形、橢圓形Python
- CSS3繪製圖形圖案效果CSSS3
- 利用 Matplotlib 繪製資料圖形(一)
- 利用 Matplotlib 繪製資料圖形(二)
- 使用Matplotlib繪製3D圖形3D
- canvas核心技術-如何繪製圖形Canvas
- 將拓撲圖和圖表繪製在 3D 六面體上3D
- CSS繪製各種幾何圖形形狀效果CSS
- WPF/C#:讓繪製的圖形可以被選中並將資訊顯示在ListBox中C#
- Python Matplotlib繪製條形圖的全過程Python
- 強大的CSS:圖形繪製合集,方便你我!CSS
- 在UnityUI中繪製線狀統計圖UnityUI
- 用HTML5繪製圖形在手機上消除模糊顯示HTML
- GPU硬體結構GPU
- Markdown繪製各種圖形———Mermaid語法AI