【Android 性能优化】布局渲染优化 ( 过渡绘制 | 自定义控件过渡绘制 | 布局文件层次深 | GPU 过渡绘制调试工具 | 背景过度绘制 )
文章目錄
- 一、 過度繪制
- 二、 過度繪制兩種情況 ( 自定義控件 | 布局文件 )
- 三、 過度繪制調試
- 1. 打開過渡繪制調試工具
- 2. 過渡繪制調試中不同顏色的含義
- 3. 過渡渲染示例
- 四、 背景過度繪制
一、 過度繪制
過渡繪制 :
① 過渡繪制 : GPU 繪制圖像時 , 會從底層到上層逐層繪制 , 底層的圖像會被上層覆蓋 , 底層圖像無法顯示給用戶觀看 , 但還是會占用繪制時間 , 這樣就造成了時間上的浪費 , 甚至導致整個渲染過程超過 16 ms ;
② 過渡繪制的示例 : 打個比方 , 給墻刷大白 , 先刷一遍綠色的 , 再刷一遍藍色的 , 最后再刷白色的 , 很明顯先刷的兩遍是無用的 , 但是耗費了很多時間 , GPU 的過渡繪制也是這個原理 , 底層繪制了很多重疊覆蓋的圖像 , 花費了時間最終并不展示給用戶觀看 ;
二、 過度繪制兩種情況 ( 自定義控件 | 布局文件 )
Android 中 GPU 過度繪制情況 : 自定義控件 , 布局文件 ;
① 自定義組件 : 在自定義 View 組件中 , 實現的的 onDraw 方法使用 Canvas 繪制了很多重疊的元素 ; 如繪制 Bitmap 后 , 又在該 Bitmap 上又繪制了一個矩形 , 這樣矩形覆蓋了 Bitmap , 這兩個圖像都要被 GPU 渲染 , 這樣就增加了渲染時間 ;
② 布局層次深 : 在普通的布局文件中 , 布局嵌套很多 ; 如外層的 RelativeLayout , 內層嵌套了 LinearLayout , 在線性布局中又嵌套了 FrameLayout , 布局嵌套會導致很多組件的重疊 ; 對于每個組件 , CPU 都會將該組件對象轉為向量圖 , 傳遞給 GPU 渲染 , 重疊圖像過多 , 顯然會使 GPU 過渡繪制 ;
設置透明背景 , 或者設置組件 Gone , 就不會繪制該組件
三、 過度繪制調試
1. 打開過渡繪制調試工具
開發者選項中 , 有 “調試 GPU 過渡重繪” 選項 , 打開該選項 , 選擇 “顯示過渡繪制區域” , 即可查看過渡繪制情況 ;
選擇 第二項 , “顯示過渡繪制區域” , 即可查看過渡繪制情況 ;
2. 過渡繪制調試中不同顏色的含義
組件上各個顏色代表的含義 : 打開過渡繪制調試工具后 , 組件上有不同的顏色 ;
① 藍色 : GPU 過度繪制了 111 次 , 沒有過渡繪制 ;
② 淺綠色 : GPU 過度繪制了 222 次 ;
③ 淺紅色 : GPU 過度繪制了 333 次 ;
④ 深紅色 : GPU 過度繪制了 444 次及 444 次以上 ;
一般情況下藍色 , 和淺綠色是可以接受的 , 紅色 , 深紅的區域絕對不能大范圍出現 ;
3. 過渡渲染示例
這是 Android 的設置界面 , 大部分是藍色 , 或淺綠 , 淺紅色只占很小的部分 ;
四、 背景過度繪制
1 . 背景設置 :
① 設置背景 : 設置了背景 , 圖片或顏色值 , 繪制增加 111 次 ;
② 透明背景 : 背景透明 , 不增加繪制次數 , 繪制增加 000 次 ;
③ 主題背景 : 在主題中設置了背景 , 也會增加 111 次繪制 ;
如果同時設置布局的背景和主題背景 , 此時會繪制 222 次 ;
刪除一次背景設置 , 這里建議刪除主題的背景 ;
2 . 刪除主題背景 :
① 使用代碼刪除 : 調用 getWindow().setBackgroundDrawable( null ) 方法 , 刪除背景 , 該方法調用調用必須 在 super.onCreate 之后, 在 setContentView 之前 ;
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 刪除背景, 該調用必須在 super.onCreate 之后, setContentView 之前getWindow().setBackgroundDrawable(null);setContentView(R.layout.activity_main); }② 主題中刪除 ( 建議 ) : 在主題中設置 <item name=“android:windowBackground”>null</item> 元素 , 然后 Activity 使用該主題 , 即可避免背景二次重繪 ;
<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><!-- 設置應用啟動時默認顯示的圖片 , 這樣比白屏/黑屏體驗好一些 --><!--<item name="android:windowBackground">@mipmap/ic_launcher</item>--><!-- 將背景設置成透明的 --><!--<item name="android:windowIsTranslucent">true</item>--></style><style name="AppTheme.NoBackground" parent="AppTheme"><!-- 布局渲染時, 不設置主題背景, 避免過度重繪 --><item name="android:windowBackground">null</item></style></resources>在 AndroidManifest.xml 的 Activity 標簽中設置該主題 , 即可取消該背景 ;
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.rtmp"><application><activityandroid:theme="@style/AppTheme.NoBackground"android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application> </manifest>或者在代碼中設置主題 :
@Overrideprotected void onCreate(Bundle savedInstanceState) {/*此時應用首界面啟動完成, 將主題恢復成其它主題此處也可以根據不同的設置, 為應用設置不同的主題*/setTheme(R.style.AppTheme.NoBackground);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); }總結
以上是生活随笔為你收集整理的【Android 性能优化】布局渲染优化 ( 过渡绘制 | 自定义控件过渡绘制 | 布局文件层次深 | GPU 过渡绘制调试工具 | 背景过度绘制 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 性能优化】应用启动优化
- 下一篇: 【Android 性能优化】布局渲染优化