Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> 安卓省電與加速 >> android硬件加速器及其問題小結

android硬件加速器及其問題小結

編輯:安卓省電與加速

 發現自己的手機上某個界面出現了花屏,某些控件背景被拉伸過多遮住了其他控件,很難看。這種現象高概率出現,分析了下發現:一旦發生這種現象,必然會打印下面這種log,google了下,這種log應該是硬件加速引入的。在從view層級關閉了硬件加速開關之後,問題沒有再出現。

[plain] 
D/OpenGLRenderer(10887): GL error from OpenGLRenderer: 0x501 
E/OpenGLRenderer(10887): GL_INVALID_VALUE 

D/OpenGLRenderer(10887): GL error from OpenGLRenderer: 0x501
E/OpenGLRenderer(10887): GL_INVALID_VALUE        硬件加速開關是android3.0開始引入的,大致有個印象,但是我們代碼中並沒有打開過硬件加速開關。自己寫了個demo,log顯示硬件加速開關確實已經被打開。看來是google做了些什麼,去官方文檔上看了看,有下面一句話:
Beginning with Android 4.0, hardware acceleration for all windows is enabled by default if your application has set either targetSdkVersion or minSdkVersion to “14" or higher.
到這裡,硬件加速開關打開的原因找到了,為什麼在這個應用的這個界面才會引入問題呢。
        先學習下android硬件加速的一些概念再說。android自3.0引入了硬件加速,即使用GPU進行繪圖,旨在得到更加平滑的動畫更加平滑滾動,和更好的總體性能和響應用戶的交互。但是硬件加速並不能完善的支持所有的繪圖,通常表現為內容不可見,異常或渲染錯誤。一般出現了問題,就需要關閉硬件加速開關。為了方便控制硬件加速開關,android在四個層面提供了支持:
1.Application level:在AndroidManifes文件中給application標簽增加如下配置語句,即可打開硬件加速開關,這個開關對整個應用起作用。

[html] 
<application android:hardwareAccelerated="true" ...> 

<application android:hardwareAccelerated="true" ...>2.Activity level:同樣還是在AndroidManifes文件中,給activity標簽增加如下配置語句,即可關閉硬件加速開關,這個開關對當前activity起作用,可以覆蓋1中的application開關:

[html] 
<application android:hardwareAccelerated="true"> 
    <activity ... /> 
    <activity android:hardwareAccelerated="false" /> 
</application> 

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>3.Window level:在代碼中增加下面代碼,即可在窗口級別打開硬件加速開關。注意在窗口級別,只能打開硬件加速開關,不能關閉,不同上面1,2。

[html]
getWindow().setFlags( 
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);4.View level:在代碼中給view設置如下屬性,即可從view層級關閉硬件加速開關。在這裡只能關閉硬件加速開關,不能打開。這個層面決定權是最高的,可以覆蓋上面三個級別。

[html]
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);       到這裡還是不清楚為什麼只有這個界面的view發生了問題。這個view不是應用覆蓋重寫的,並不復雜。看了下google後面提供的一些高效使用硬件加速開關的技巧:
Reduce the number of views in your application
Avoid overdraw
Don't create render objects in draw methods
Don't modify shapes too often
Don't modify bitmaps too often
後來打開android開發人員選項的檢查是否過度繪制的功能,發現這個界面有很明顯的過度繪制。到這裡基本可以得出,這個界面由於打開硬件加速器高概率出現花屏,應該是違反了第二條:Avoid overdraw。去看了下google的Android Drawing Models說明,還是沒有從根本上弄清楚硬件加速是怎麼一個回事。沒有從代碼上看到這些總是感覺不太清楚,不過對於硬件加速了解到這裡已經足夠解決開發過程中遇到的問題。最後補充說明在分析上述的花屏問題時,發現將.9圖片去掉換成普通資源,該問題也會得到修正。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved