Android 性能優(yōu)化--06:繪制優(yōu)化

本文轉(zhuǎn)載自:Android性能優(yōu)化:繪制優(yōu)化

目錄

性能優(yōu)化6-1.PNG

1.影響的性能

??繪制性能的好壞主要影響:Android應(yīng)用中的頁面顯示速度锡宋。

2.如何影響性能

??繪制影響Android性能的實(shí)質(zhì):頁面的繪制時(shí)間。1個(gè)頁面通過遞歸完成測量和繪制過程特恬。

3.優(yōu)化思路

??主要優(yōu)化方向是:

  • 降低View.onDraw()的復(fù)雜度;

  • 避免過度繪制(Overdraw)徐钠。

4.具體優(yōu)化方案

性能優(yōu)化6-2.png

4.1 降低View.onDraw()的復(fù)雜度

4.1.1 onDraw()中不要?jiǎng)?chuàng)建新的局部對象

性能優(yōu)化6-3.PNG

4.1.2 避免onDraw()執(zhí)行大量和耗時(shí)操作

性能優(yōu)化6-4.PNG

4.2 避免過度繪制(Overdraw)

4.2.1 過度繪制的簡介

性能優(yōu)化6-5.PNG

4.2.2 過度繪制的表現(xiàn)形式

??過度繪制會導(dǎo)致屏幕顯示的色塊不同(可在開發(fā)者選項(xiàng)中開啟)癌刽,具體如下:

性能優(yōu)化6-6.png

實(shí)例說明:

性能優(yōu)化6-7.png

4.2.3 過度繪制的優(yōu)化原則

??很多過度繪制是難以避免的,如上述實(shí)例的文字和背景導(dǎo)致的過度繪制尝丐;只能盡可能避免過度繪制:

  • 盡可能地控制過度繪制的次數(shù)在2次(綠色)以下显拜,藍(lán)色最理想;

  • 盡可能避免過度繪制的粉色和紅色情況爹袁;

  • 不允許3 次以上的過度繪制(淡紅色)面積超過屏幕大小的1/4远荠。

4.2.4 優(yōu)化方案

  • 移除默認(rèn)的Window背景;

  • 移除控件中不必要的背景失息;

  • 減少布局文件的層級(嵌套)譬淳;

  • 自定義控件View優(yōu)化:使用 clipRect() 、 quickReject()盹兢。

(1)優(yōu)化方案1: 移除默認(rèn)的Window背景邻梆。

  • 背景:一般應(yīng)用程序默認(rèn)繼承的主題windowBackground,如默認(rèn)的Light主題:
<style name="Theme.Light">
    <item name="isLightTheme">true</item>
    <item name="windowBackground">@drawable/screen_background_selector_light</item>
    ...
</style>
  • 問題
    ??一般情況下绎秒,該默認(rèn)的Window背景基本用不上:因背景都自定義設(shè)置浦妄;若不移除,則導(dǎo)致所有界面都多1次繪制见芹。

  • 解決方案:移除默認(rèn)的Window背景剂娄。

        <!-- 方式1:在應(yīng)用的主題中添加如下的一行屬性 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 或者 -->
        <item name="android:windowBackground">@null</item>

        <!-- 方式2:在BaseActivity的onCreate()方法中使用下面的代碼移除 -->
        getWindow().setBackgroundDrawable(null);
        <!-- 或者 -->
        getWindow().setBackgroundDrawableResource(android.R.color.transparent);

(2)優(yōu)化方案2:移除控件中不必要的背景。
??如2個(gè)常見場景:

  • 場景1:ListView與Item
    ??列表頁(ListView) 與其內(nèi)子控件(Item)的背景相同:白色玄呛,故可移除子控件(Item)布局中的背景阅懦。
性能優(yōu)化6-8.png
  • 場景2:ViewPager與Fragment
    ??對于1個(gè)ViewPager+多個(gè)Fragment組成的首頁界面,若每個(gè)Fragment都設(shè)有背景色把鉴,即ViewPager則無必要設(shè)置故黑,可移除儿咱。
性能優(yōu)化6-9.png

關(guān)于更多場景,可使用工具Hierarchy View查看场晶,具體請看文章: 過渡繪制的使用工具:Hierarchy View

(3)優(yōu)化方案3:減少布局文件的層級(減少不必要的嵌套)混埠。

  • 原理:減少不必要的嵌套 --> UI層級少 --> 過度繪制的可能性低。

  • 優(yōu)化方式:使用布局標(biāo)簽<merge>并合適選擇布局類型诗轻。

具體請看文章:《Android 性能優(yōu)化--02:布局優(yōu)化》

(4)優(yōu)化方案4:自定義控件View優(yōu)化:使用 clipRect() 钳宪、 quickReject()

  • clipRect()
    ??作用:給Canvas設(shè)置一個(gè)裁剪區(qū)域,只有在該區(qū)域內(nèi)才會被繪制扳炬,區(qū)域之外的都不繪制吏颖。
    ??實(shí)例:DrawerLayout布局的左抽屜布局。
性能優(yōu)化6-10.png
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTim)
        // 僅貼出關(guān)鍵代碼

        // 1\. 遍歷DrawerLayout的child view恨樟,拿到抽屜布局
        for (int i = 0; i < childCount; i++) {
            final View v = getChildAt(i);
            if (v == child || v.getVisibility() != VISIBLE
                    || !hasOpaqueBackground(v) || !isDrawerView(v)
                    || v.getHeight() < height) {
                continue;
            }
            // a. 若是左抽屜布局
            // 則取抽屜布局的右邊界作為裁剪區(qū)的左邊界半醉、設(shè)置原主布局的裁剪區(qū)域,如上圖裁剪區(qū)域
            if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
                final int vright = v.getRight();
                if (vright > clipLeft) clipLeft = vright;
            // b. 若是右抽屜布局
            // 則取抽屜布局的左邊界作為裁剪區(qū)的右邊界劝术、設(shè)置原主布局的裁剪區(qū)域
            } else {
                final int vleft = v.getLeft();
                if (vleft < clipRight) clipRight = vleft;
            }
        }
        // 2\. 通過clipRect()設(shè)置原主布局的顯示范圍: 裁剪區(qū)域缩多,使其僅在上圖中的紅框區(qū)域(即不阻礙抽屜布局的區(qū)域)顯示
       // 從而避免過度繪制
        canvas.clipRect(clipLeft, 0, clipRight, getHeight());
    }
    ......                       
}
  • quickreject()

??作用:判斷和某個(gè)矩形相交。
??具體措施:若判斷與矩形相交养晋,則可跳過相交的區(qū)域衬吆,從而減少過度繪制。

4.3 其他優(yōu)化方案

性能優(yōu)化6-11.png

4.4 總結(jié)

性能優(yōu)化6-12.png

5.布局調(diào)優(yōu)工具

(1)背景:盡管已經(jīng)注意到上述的優(yōu)化策略绳泉,但實(shí)際開發(fā)中難免還是會出現(xiàn)布局性能的問題逊抡。

(2)解決方案:使用布局調(diào)優(yōu)工具。

此處主要介紹常用的:hierarchy viewer零酪、Profile GPU Rendering冒嫡、Systrace。

5.1 Hierarchy Viewer

(1)簡介:Android Studio 提供的UI性能檢測工具四苇。

(2)作用:可視化獲得UI布局設(shè)計(jì)結(jié)構(gòu)和各種屬性信息灯谣,幫助我們優(yōu)化布局設(shè)計(jì)。

即:方便查看Activity布局蛔琅,各個(gè)View的屬性胎许、布局測量-布局-繪制的時(shí)間。

(3)具體使用:Hierarchy Viewer 使用指南

5.2 Profile GPU Rendering

(1)簡介:一個(gè)圖形監(jiān)測工具罗售。

(2)作用:渲染辜窑、繪制性能追蹤,能實(shí)時(shí)反應(yīng)當(dāng)前繪制的耗時(shí)寨躁。

(3)具體使用:橫軸 = 時(shí)間穆碎、縱軸 = 每幀的耗時(shí);隨著時(shí)間推移职恳,從左到右的刷新呈現(xiàn)所禀;提供一個(gè)標(biāo)準(zhǔn)的耗時(shí)方面,如果高于標(biāo)準(zhǔn)耗時(shí),就表示當(dāng)前這一幀丟失色徘。

性能優(yōu)化6-13.png

更詳細(xì)使用請看:Profile GPU Rendering 使用指南

5.3 Systrace

(1)簡介:Android 4.1以上版本提供的性能數(shù)據(jù)采樣和分析工具恭金。

(2)作用:檢測Android系統(tǒng)各個(gè)組件隨著時(shí)間的運(yùn)行狀態(tài)并提供解決方案。

  • 收集運(yùn)行信息褂策,從而幫助開發(fā)者更直觀地分析系統(tǒng)瓶頸横腿,改進(jìn)性能;

  • 檢測范圍包括:Android關(guān)鍵子系統(tǒng)(如WindowManagerService 等 Framework 部分關(guān)鍵模塊)斤寂、服務(wù)耿焊、View系統(tǒng);

  • 功能包括:跟蹤系統(tǒng)的I/O 操作遍搞、內(nèi)核工作隊(duì)列罗侯、CPU 負(fù)載等,在 UI 顯示性能分析上提供很好的數(shù)據(jù)溪猿,特別是在動畫播放不流暢歇父、渲染卡等問題上。

(3)具體使用:Systrace 使用指南

6.總結(jié)

性能優(yōu)化6-14.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末再愈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子护戳,更是在濱河造成了極大的恐慌翎冲,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳荒,死亡現(xiàn)場離奇詭異抗悍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钳枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門缴渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鱼炒,你說我怎么就攤上這事衔沼。” “怎么了昔瞧?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵指蚁,是天一觀的道長。 經(jīng)常有香客問我自晰,道長凝化,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任酬荞,我火速辦了婚禮搓劫,結(jié)果婚禮上瞧哟,老公的妹妹穿的比我還像新娘。我一直安慰自己枪向,他們只是感情好勤揩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遣疯,像睡著了一般雄可。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缠犀,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天数苫,我揣著相機(jī)與錄音,去河邊找鬼辨液。 笑死虐急,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滔迈。 我是一名探鬼主播止吁,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燎悍!你這毒婦竟也來了敬惦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤谈山,失蹤者是張志新(化名)和其女友劉穎俄删,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奏路,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畴椰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸽粉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斜脂。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖触机,靈堂內(nèi)的尸體忽然破棺而出帚戳,到底是詐尸還是另有隱情,我是刑警寧澤儡首,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布销斟,位于F島的核電站,受9級特大地震影響椒舵,放射性物質(zhì)發(fā)生泄漏蚂踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一笔宿、第九天 我趴在偏房一處隱蔽的房頂上張望犁钟。 院中可真熱鬧棱诱,春花似錦、人聲如沸涝动。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醋粟。三九已至靡菇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米愿,已是汗流浹背厦凤。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留育苟,地道東北人较鼓。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像违柏,于是被迫代替她去往敵國和親博烂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容