[譯]Android性能優化課程(二):過度繪制

jopen 9年前發布 | 79K 次閱讀 Android Android開發 移動開發

度繪制描述的是屏幕上一個像素在單個幀中被重繪了多少次。比如一個有背景的TextView,那么顯示文本的那些像素至少繪制了兩次,一次是背景,一次是文本。過度繪制是Android平臺上一個很棘手的性能問題,它非常容易出現,幸運的是,它也同樣容易被修復。我們可以通過手機設置里面的開發者選項,打開Show GPU Overdraw的選項,來查看某個app過度繪制的情況。

內容概要

這篇文章大部分內容翻譯自Google的官方視頻教程,優酷地址。除了翻譯視頻內容外,本篇文章還增加了一部分內容:在項目中如何減少程序的過度繪制。

在視頻中,Colt McAnlis會告訴我們什么是過度繪制,如何檢測過度繪制,以及一個簡單的減少過度繪制的方法。

另外一部分,我會具體談談有哪些方法可以真正減少app的過度繪制。當然,實際情況還得看你的app是如何設計編寫的,這里只是提供一些通用的方法和建議,并不作為設計app和程序編寫的準則。

視頻翻譯

  • 過度繪制的概念
  • </ul>

    如果你粉刷過一個房間或一所房子,就會知道給墻壁涂上顏色需要做大量的工作。假如你還要重新粉刷一次的話,第二次粉刷的顏色會覆蓋住第一次的顏色,第一次的顏色就永遠不可見了,等于你第一次粉刷做的大量工作就完全被浪費掉。這太可怕了。

    同樣的道理,如果在你的應用程序中浪費精力去繪制一些東西同樣會產生性能問題。過度繪制這個名詞就是用來描述屏幕上一個像素在單個幀中被重繪了多少次。

    • 過度繪制分析
    • </ul>

      過度繪制其實是一個性能和設計的交叉點。我們在設計上追求很華麗的視覺效果,但一般來說這種視覺效果會采用非常多的層疊組件來實現,這時候就會帶來過度繪制的問題。比如:我們有一疊UI組件,這些組件從上到下分布,上面的組件是可以被用戶看見的,而在下面的組件是不可見的,但是我們依然要花很多時間去繪制那些不可見的組件,因為在某些時候,它也可能會顯示出來。但這確實是在浪費CPU和GPU的資源啊。

      • 檢測過度繪制
      • </ul>

        當然,為了讓應用程序得到最大的性能發揮,我們必須把過度繪制減到最少。幸運的是,我們可以通過一個簡單的方法檢測出過度繪制:在手機設置中的開發者選項里,打開Show GPU Overdraw的選項,就可以檢測某個app界面上過度繪制的情況。

        打開這個選項后,你的手機會出現一些奇怪的顏色,請不要驚慌,這是正常的。系統正在你的屏幕上通過給像素繪制不同的顏色來
        顯示這個像素被過度繪制的次數。一共有四種顏色:藍色、綠色、淡紅、深紅。根據過度繪制的次數,依次遞增。1x過度繪制是藍色、2x是綠色、3x是淡紅、4x是深紅。

        • 目標和一個簡單的方法
        • </ul>

          你的目標就是盡可能的減少過度繪制,使得你在屏幕更多的看到的是藍色而不是深紅色。

          過度繪制也許是因為你的UI布局中存在大量重疊的view,但一個更為普遍的情況是因為那些不必要的重疊著的背景。例如某個Activity有一個背景,Layout也有自己的背景,同時它的子View又分別有自己的背景。僅僅是通過移除不需要的背景圖片,就可以使你的應用程序從一大群那種憤怒的紅色變成一片像大海一樣平靜的藍色。

          • 保持冷靜,keep going
          • </ul>

            雖然過度繪制很容易出現,但也比較容易消滅。這就是為什么你需要我們Android性能課程中的其他資源,不要忘記加入Google+社區哦(繼續推銷Google+中)。分析代碼時請保持冷靜,千萬要記住,性能很重要。(萬年不變的一句結尾)

            總結和建議

            • 過度繪制產生的原因
            • </ul>

              1. 太多重疊的背景
                重疊著的背景有時候是有必要的,有時候是沒必要的。這要視你的項目具體情況而定.

                </li>

              2. 太多疊加的View
                或者本來這個UI布局就很復雜或者你是為了追求一個炫麗的視覺效果,這都有可能使得很多view疊加在一起。這個情況非常普遍,下面的建議中會談談怎么減少這種情況帶來的影響。

                </li>

              3. 復雜的Layout層級
                復雜的層級關系,這個在布局中也很常見,下面也會說這種情況怎么做可以盡可能的減少過度繪制。

                </li> </ol>

                • 建議
                • </ul>

                  1. 太多重疊的背景
                    這個問題其實最容易解決,建議就是檢查你在布局和代碼中設置的背景,有些背景是被隱藏在底下的,它永遠不可能顯示出來,這種沒必要的背景一定要移除,因為它很可能會嚴重影響到app的性能。如果采用的是selector的背景,將normal狀態的color設置為”@android:color/transparent”,也同樣可以解決問題。

                    </li>

                  2. 太多重疊的view
                    第一個建議是:使用ViewStub來加載一些不常用的布局,它是一個輕量級且默認不可見的視圖,可以動態的加載一個布局,只有你用到這個重疊著的view的時候才加載,推遲加載的時間。第二個建議是:如果使用了類似viewpager+Fragment這樣的組合或者有多個Fragment在一個界面上,需要控制Fragment的顯示和隱藏,盡量使用動態地Inflation view,它的性能要比SetVisiblity好。

                    </li>

                  3. 復雜的Layout層級
                    這里的建議比較多一些,首先推薦用Android提供的布局工具Hierarchy Viewer來檢查和優化布局。第一個建議是:如果嵌套的線性布局加深了布局層次,可以使用相對布局來取代。第二個建議是:用標簽來合并布局,這可以減少布局層次。第三個建議是:用標簽來重用布局,抽取通用的布局可以讓布局的邏輯更清晰明了。記住,這些建議的最終目的都是使得你的Layout在Hierarchy Viewer里變得寬而淺,而不是窄而深。

                    </li> </ol>

                    實戰推薦

                    這篇文章基本上都是理論上的分析,所以這里推薦一篇實戰分析的文章,來自于高建武,一個有理想的程序員。文章地址:http://www.androidperformance.com/android-performance-optimization-overdraw-2.html

                    最后說明一點,由于這篇文章大部分內容還是來自于google的視頻,所以標題還是寫成翻譯的文章。

                    來自:http://lzyblog.com/2015/01/19/-%E8%AF%91-Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%AF%BE%E7%A8%8B%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!