国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)界面顯示慢-過度繪制優(yōu)化

2019-11-09 18:03:32
字體:
供稿:網(wǎng)友

本文原文鏈接:http://www.cnblogs.com/liuling/p/2015-10-08-2.html

作者名:殘劍

如果一個(gè)布局十分復(fù)雜,那么就需要來排查是否出現(xiàn)了過度繪制,如果出現(xiàn)了,那么很可能會(huì)造成刷新率下降,造成卡頓的現(xiàn)象。那么什么是過度繪制呢?過度繪制就是在同一個(gè)區(qū)域中疊加了多個(gè)控件。這就像小時(shí)候我們畫畫,白紙就是沒有繪制的畫板,如果我們畫了一個(gè)房子,涂上了紅色,又在上面畫了窗戶,圖上了棕色,窗戶上又畫了藍(lán)色的玻璃,這重重復(fù)的疊加就是過度繪制,在白紙上的結(jié)果是,過度繪制的區(qū)域紙會(huì)被水筆浸的比較濕,在手機(jī)上就會(huì)出現(xiàn)顯示較慢。如果說這是感性的認(rèn)識(shí),那么我就引用下面一段話來理性的解釋一下:

1. 布局文件是一個(gè)xml文件,inflate布局文件其實(shí)就是解析xml,根據(jù)標(biāo)簽信息創(chuàng)建相應(yīng)的布局對(duì)象并做關(guān)聯(lián)。xml中的標(biāo)簽和屬性設(shè)置越多,節(jié)點(diǎn)樹的深度越深,在解析時(shí)要執(zhí)行的判斷邏輯、函數(shù)的嵌套和遞歸就越多,所以時(shí)間消耗越多;

2. inflate操作只是布局影響的第一個(gè)環(huán)節(jié),一個(gè)界面要顯示出來,在requestLayout后還要執(zhí)行一系列的measure、layout、draw的操作,每一步的執(zhí)行時(shí)間都會(huì)受到布局本身的影響。而界面的最終顯示是所有這些操作完成后才實(shí)現(xiàn)的,所以如果布局質(zhì)量差,會(huì)增加每一步操作的時(shí)間成本,最終顯示時(shí)間就會(huì)比較長。

現(xiàn)在,我們就來說說如何查看是否有過度繪制,和如何避免它吧。

 

一、查看是否存在過度繪制

1. GPU過渡繪制:對(duì)于過度繪制的測(cè)試主要通過人工進(jìn)行測(cè)試,也是發(fā)現(xiàn)應(yīng)用過渡繪制的首選途徑 .通過打開開發(fā)者選項(xiàng)中的 顯示GPU過度繪制(魅族手機(jī):設(shè)置—輔助功能–開發(fā)人員工具–硬件加速渲染—調(diào)試GPU過渡繪制— 顯示過渡繪制區(qū)域.)來進(jìn)行測(cè)試(PS:只有android4.2及以上的版本才具備此功能)

1. 顏色標(biāo)識(shí): 從好到差:藍(lán)-綠-淡紅-紅

1. 藍(lán)色1x過度繪制2. 綠色2x過度繪制3. 淡紅色3x過度繪制4. 紅色超過4x過度繪制

2. 驗(yàn)收標(biāo)準(zhǔn):

1. 控制過度繪制為2x2. 不允許存在4x過度繪制3. 不允許存在面積超過屏幕1/4區(qū)域的3x過度繪制(淡紅色區(qū)域)

從圖中我們就可以看到,文字部分出現(xiàn)了綠色(因?yàn)楹偷撞康乃{(lán)色疊加了,所以變成了黃綠色),在頂部開關(guān)部分出現(xiàn)了紅色,也就是四層的過度繪制,這是需要避免的。但由于在屏幕上占的位置很小,所以可以酌情考慮。

 

上面面是小米商店的截屏,可以看見其中有大量的過度繪制區(qū)域,總結(jié)下來過度繪制較常見于文字區(qū)域。

 

二、避免過度繪制的方法

下面這段文字來自他人博客:

作者:Gracker出處:androidperformance.com本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。打賞一下: 微博打賞

1. 盡量多使用RelativeLayout和LinearLayout, 不要使用絕對(duì)布局AbsoluteLayout,

1. 在布局層次一樣的情況下, 建議使用LinearLayout代替RelativeLayout, 因?yàn)長inearLayout性能要稍高一點(diǎn).2. 在完成相對(duì)較復(fù)雜的布局時(shí),建議使用RelativeLayout,RelativeLayout可以簡單實(shí)現(xiàn)LinearLayout嵌套才能實(shí)現(xiàn)的布局.

2. 將可復(fù)用的組件抽取出來并通過include標(biāo)簽使用;3. 使用ViewStub標(biāo)簽來加載一些不常用的布局;4. 動(dòng)態(tài)地inflation view性能要比SetVisiblity性能要好.當(dāng)然用VIewStub是最好的選擇.5. 使用merge標(biāo)簽減少布局的嵌套層次6. 去掉多余的背景顏色

7. 對(duì)于有多層背景顏色的Layout來說,留最上面一層的顏色即可,其他底層的顏色都可以去掉8. 對(duì)于使用Selector當(dāng)背景的Layout(比如ListView的Item,會(huì)使用Selector來標(biāo)記點(diǎn)擊,選擇等不同的狀態(tài)),可以將normal狀態(tài)的color設(shè)置為”@Android:color/transparent”,來解決對(duì)應(yīng)的問題

9. 內(nèi)嵌使用包含layout_weight屬性的LinearLayout會(huì)在繪制時(shí)花費(fèi)昂貴的系統(tǒng)資源,因?yàn)槊恳粋€(gè)子組件都需要被測(cè)量兩次。在使用ListView與GridView的時(shí)候,這個(gè)問題顯的尤其重要,因?yàn)樽咏M件會(huì)重復(fù)被創(chuàng)建.所以要盡量避免使用Layout_weight10. 使得Layout寬而淺,而不是窄而深(在Hierarchy Viewer的Tree視圖里面體現(xiàn))

 

上面提到的多個(gè)工具和技巧我都在之前的文章有所講解了,在實(shí)際開發(fā)過程中需要多多思考,根據(jù)情況來使用不同的技巧。

首先將講解一下GPU過渡繪制,也是開發(fā)者最直接接觸的部分吧,這個(gè)內(nèi)容將分為兩個(gè)部分來將講,第一部分初步講解一下gpu過渡繪制的原理,和一些優(yōu)化建議,第二部分將用實(shí)際例子來講解優(yōu)化GPU過渡繪制的一般步驟。

過渡繪制概念

GPU過渡繪制的概念:GPU過度繪制指的是在屏幕一個(gè)像素上繪制多次(超過一次),比如一個(gè)TextView后有背景,那么顯示文本的像素至少繪了兩次,一次是背景,一次是文本。GPU過度繪制或多或少對(duì)性能有些影響,設(shè)備的內(nèi)存帶寬是有限的,當(dāng)過度繪制導(dǎo)致應(yīng)用需要更多的帶寬(超過了可用帶寬)的時(shí)候性能就會(huì)降低。帶寬的限制每個(gè)設(shè)備都可能是不一樣的。

過渡繪制的原因

太多的View疊加復(fù)雜的層級(jí)疊加更長的inflation時(shí)間

過渡繪制和不合理的xml布局的影響

布局文件是一個(gè)xml文件,inflate布局文件其實(shí)就是解析xml,根據(jù)標(biāo)簽信息創(chuàng)建相應(yīng)的布局對(duì)象并做關(guān)聯(lián)。xml中的標(biāo)簽和屬性設(shè)置越多,節(jié)點(diǎn)樹的深度越深,在解析時(shí)要執(zhí)行的判斷邏輯、函數(shù)的嵌套和遞歸就越多,所以時(shí)間消耗越多;inflate操作只是布局影響的第一個(gè)環(huán)節(jié),一個(gè)界面要顯示出來,在requestLayout后還要執(zhí)行一系列的measure、layout、draw的操作,每一步的執(zhí)行時(shí)間都會(huì)受到布局本身的影響。而界面的最終顯示是所有這些操作完成后才實(shí)現(xiàn)的,所以如果布局質(zhì)量差,會(huì)增加每一步操作的時(shí)間成本,最終顯示時(shí)間就會(huì)比較長。

過渡繪制的一些基本概念:

Android提供了三個(gè)工具來幫助辨別和解決重繪問題:Hierachy Viewer,Tracer for OpenGL和Show GPU overdraw。前兩個(gè)可以在ADT工具或者獨(dú)立的monitor工具中找到,最后一個(gè)是在開發(fā)者選項(xiàng)的一部分.

GPU過渡繪制測(cè)試:對(duì)于過度繪制的測(cè)試主要通過人工進(jìn)行測(cè)試,也是發(fā)現(xiàn)應(yīng)用過渡繪制的首選途徑 .通過打開開發(fā)者選項(xiàng)中的 顯示GPU過度繪制(魅族手機(jī):設(shè)置—輔助功能–開發(fā)人員工具–硬件加速渲染—調(diào)試GPU過渡繪制— 顯示過渡繪制區(qū)域. (魅族手機(jī)需要打開開發(fā)者模式:需要在電話界面輸入: ##6961## )) 來進(jìn)行測(cè)試(PS:只有android4.2及以上的版本才具備此功能)顏色標(biāo)識(shí): GPU過渡繪制從好到差:藍(lán)-綠-淡紅-紅藍(lán)色1x過度繪制綠色2x過度繪制淡紅色3x過度繪制紅色超過4x過度繪制驗(yàn)收標(biāo)準(zhǔn):控制過度繪制為2x不允許存在4x過度繪制不允許存在面積超過屏幕1/4區(qū)域的3x過度繪制(淡紅色區(qū)域)

優(yōu)化工具介紹

Lint工具:Eclipse中,點(diǎn)擊即可,下面的窗口中會(huì)出現(xiàn)提示,根據(jù)提示和具體解決辦法消除.Android Studio自帶Lint工具,不合理或者需要優(yōu)化和注意的地方,會(huì)用黃色標(biāo)記出來.Lint工具不僅對(duì)布局有很好的優(yōu)化建議,對(duì)代碼中不合理的活著存在潛在風(fēng)險(xiǎn)的模塊也會(huì)提出優(yōu)化建議,所以一個(gè)好的建議是:多使用Lint工具檢查自己的應(yīng)用,盡量消除所有的建議.Lint工具可以用命令行來運(yùn)行,具體使用可以參考:tools.android.com

Lint工具的提升例子(摘自官方文檔):

Use compound drawables(使用compound drawables) - A LinearLayout which contains an ImageView and a TextView can be more efficiently handled as a compound drawable.Merge root frame(使用Merge根框架) - If a FrameLayout is the root of a layout and does not PRovide background or padding etc, it can be replaced with a merge tag which is slightly more efficient.Useless leaf(去除無用的分支) - A layout that has no children or no background can often be removed (since it is invisible) for a flatter and more efficient layout hierarchy.Useless parent (去除無用的父控件)- A layout with children that has no siblings, is not a ScrollView or a root layout, and does not have a background, can be removed and have its children moved directly into the parent for a flatter and more efficient layout hierarchy.Deep layouts (注意Layout的深度) - Layouts with too much nesting are bad for performance. Consider using flatter layouts such as RelativeLayout or GridLayout to improve performance. The default maximum depth is

Hierarchy Viewer:此工具是一個(gè)ADT工具(或者monitor,最新版本的SDK建議不使用獨(dú)立的HV工具,而是直接在monitor中進(jìn)行操作.)的一部分,可以被用作對(duì)視圖層級(jí)進(jìn)行快速解讀。在處理布局問題時(shí)特別有用,對(duì)于性能問題也很適用。Hierarchy Viewer默認(rèn)只能在非加密設(shè)備使用,例如工程機(jī),工程平板或者模擬器。為了能夠在任何手機(jī)上使用Hierarchy Viewer,你得在你的應(yīng)用中添加ViewServer,這是一個(gè)開源庫,使用方法可以參考這里。連接上設(shè)備,打開Hierarchy Viewer(定位到tools/目錄下,直接執(zhí)行hierarchyviewer的命令,選定需要查看的Process,再點(diǎn)擊Load View Hierarchy會(huì)顯示出當(dāng)前界面的布局Tree。在每個(gè)模塊的Traffic light上有三個(gè)燈,分別代表了Measure, Layout and Draw三個(gè)步驟的性能。

布局優(yōu)化建議

在Android UI布局過程中,通過遵守一些慣用、有效的布局原則,我們可以制作出高效且復(fù)用性高的UI,概括來說包括如下幾點(diǎn):

盡量多使用RelativeLayout和LinearLayout, 不要使用絕對(duì)布局AbsoluteLayout,

在布局層次一樣的情況下, 建議使用LinearLayout代替RelativeLayout, 因?yàn)長inearLayout性能要稍高一點(diǎn).在完成相對(duì)較復(fù)雜的布局時(shí),建議使用RelativeLayout,RelativeLayout可以簡單實(shí)現(xiàn)LinearLayout嵌套才能實(shí)現(xiàn)的布局.

將可復(fù)用的組件抽取出來并通過include標(biāo)簽使用;

使用ViewStub標(biāo)簽來加載一些不常用的布局;動(dòng)態(tài)地inflation view性能要比SetVisiblity性能要好.當(dāng)然用VIewStub是最好的選擇.使用merge標(biāo)簽減少布局的嵌套層次

去掉多余的背景顏色(查看背景顏色是否多余,可以將HierarchyView中的圖導(dǎo)出為PSD文件,然后用photoshop查看.具體可以參考這個(gè)視頻)

對(duì)于有多層背景顏色的Layout來說,留最上面一層的顏色即可,其他底層的顏色都可以去掉對(duì)于使用Selector當(dāng)背景的Layout(比如ListView的Item,會(huì)使用Selector來標(biāo)記點(diǎn)擊,選擇等不同的狀態(tài)),可以將normal狀態(tài)的color設(shè)置為/”@android:color/transparent”,來解決對(duì)應(yīng)的問題

內(nèi)嵌使用包含layout_weight屬性的LinearLayout會(huì)在繪制時(shí)花費(fèi)昂貴的系統(tǒng)資源,因?yàn)槊恳粋€(gè)子組件都需要被測(cè)量兩次。在使用ListView與GridView的時(shí)候,這個(gè)問題顯的尤其重要,因?yàn)樽咏M件會(huì)重復(fù)被創(chuàng)建.所以要盡量避免使用Layout_weight

使得Layout寬而淺,而不是窄而深(在Hierarchy Viewer的Tree視圖里面體現(xiàn))

源碼相關(guān)

另外有能力看源碼的同學(xué),下面是繪制OverDraw的源碼位置:/frameworks/base/libs/hwui/OpenGLRenderer.cpp,有興趣的可以去研究研究。

123456789101112131415161718192021222324252627282930313233343536373839404142
void OpenGLRenderer::renderOverdraw() {    if (mCaches.debugOverdraw && getTargetFbo() == 0) {        const Rect* clip = &mTilingClip;        mCaches.enableScissor();        mCaches.setScissor(clip->left, mFirstSnapshot->height - clip->bottom,                clip->right - clip->left, clip->bottom - clip->top);        // 1x overdraw        mCaches.stencil.enableDebugTest(2);        drawColor(mCaches.getOverdrawColor(1), SkXfermode::kSrcOver_Mode);        // 2x overdraw        mCaches.stencil.enableDebugTest(3);        drawColor(mCaches.getOverdrawColor(2), SkXfermode::kSrcOver_Mode);        // 3x overdraw        mCaches.stencil.enableDebugTest(4);        drawColor(mCaches.getOverdrawColor(3), SkXfermode::kSrcOver_Mode);        // 4x overdraw and higher        mCaches.stencil.enableDebugTest(4, true);        drawColor(mCaches.getOverdrawColor(4), SkXfermode::kSrcOver_Mode);        mCaches.stencil.disable();    }}void OpenGLRenderer::countOverdraw() {    size_t count = mWidth * mHeight;    uint32_t* buffer = new uint32_t[count];    glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, &buffer[0]);    size_t total = 0;    for (size_t i = 0; i < count; i++) {        total += buffer[i] & 0xff;    }    mOverdraw = total / float(count);    delete[] buffer;}

還有QA可能用得到的一個(gè)指標(biāo):OverDraw數(shù)值,這個(gè)的源碼位置在Framework/base/core/java/android/view/HardwareRender.java中(5.0中去掉了這個(gè)數(shù)值的顯示)

1234567891011121314151617181920212223242526272829303132333435363738
private void debugOverdraw(View.AttachInfo attachInfo, Rect dirty,                HardwareCanvas canvas, DisplayList displayList) {            if (mDebugOverdraw == OVERDRAW_TYPE_COUNT) {                if (mDebugOverdrawLayer == null) {                    mDebugOverdrawLayer = createHardwareLayer(mWidth, mHeight, true);                } else if (mDebugOverdrawLayer.getWidth() != mWidth ||                        mDebugOverdrawLayer.getHeight() != mHeight) {                    mDebugOverdrawLayer.resize(mWidth, mHeight);                }                if (!mDebugOverdrawLayer.isValid()) {                    mDebugOverdraw = -1;                    return;                }                HardwareCanvas layerCanvas = mDebugOverdrawLayer.start(canvas, dirty);                countOverdraw(layerCanvas);                final int restoreCount = layerCanvas.save();                layerCanvas.drawDisplayList(displayList, null, DisplayList.FLAG_CLIP_CHILDREN);                layerCanvas.restoreToCount(restoreCount);                mDebugOverdrawLayer.end(canvas);                float overdraw = getOverdraw(layerCanvas);                DisplayMetrics metrics = attachInfo.mRootView.getResources().getDisplayMetrics();                drawOverdrawCounter(canvas, overdraw, metrics.density);            }}private void drawOverdrawCounter(HardwareCanvas canvas, float overdraw, float density) {            final String text = String.format(/"%.2fx/", overdraw);            final Paint paint = setupPaint(density);            // HSBtoColor will clamp the values in the 0..1 range            paint.setColor(Color.HSBtoColor(0.28f - 0.28f * overdraw / 3.5f, 0.8f, 1.0f));            canvas.drawText(text, density * 4.0f, mHeight - paint.getFontMetrics().bottom, paint);}

參考文章

優(yōu)化過程反編譯并添加gpu顯示http://developer.android.com/training/improving-layouts/optimizing-layout.html#Inspecthttp://developer.android.com/training/improving-layouts/reusing-layouts.htmlhttp://developer.android.com/training/improving-layouts/loading-ondemand.htmlhttp://developer.android.com/training/improving-layouts/smooth-scrolling.htmlhttp://developer.android.com/tools/help/hierarchy-viewer.htmlhttp://tools.android.com/tips/lint

做設(shè)計(jì)的人很少能知道GPU過度繪制是個(gè)什么鬼?跟設(shè)計(jì)有什么關(guān)系?今天就讓大家了解了解,首先來普及一下Android開發(fā)者選項(xiàng)中的Debug GPU overdraw

GPU過度繪制定義

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

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

GPU過度繪制就指的是在屏幕一個(gè)像素上繪制多次(超過一次),GPU過度繪制或多或少對(duì)性能有些影響。

GPU過度繪制分析

過度繪制其實(shí)是一個(gè)性能和設(shè)計(jì)的交叉點(diǎn)。我們?cè)谠O(shè)計(jì)上追求很華麗的視覺效果,但一般來說這種視覺效果會(huì)采用非常多的層疊組件來實(shí)現(xiàn),這時(shí)候就會(huì)帶來過度繪制的問題。我們?cè)賮砜纯淳唧w顯示在Android界面層級(jí)關(guān)系:

當(dāng)我們來繪制一個(gè)界面時(shí),會(huì)有一個(gè)windows,然后是建立Activity,在Activity里可以建立多個(gè)view,或view group,view也可以嵌套view。這些組件從上到下分布,上面的組件是可以被用戶看見的,而在下面的組件是不可見的,但是我們依然要花很多時(shí)間去繪制那些不可見的組件,因?yàn)樵谀承r(shí)候,它也可能會(huì)顯示出來。

檢測(cè)過度繪制

如何查看是否過度繪制:

設(shè)置-開發(fā)者選項(xiàng)-調(diào)試GPU過度繪制-顯示過度繪制區(qū)域(過度渲染等,不同機(jī)器可能不同)

然后就可以看看你的應(yīng)用是否存在過度繪制的情況了。

那么如何判斷界面是否存在過度繪制呢?

開啟后,點(diǎn)擊我們的應(yīng)用,可以看到各種顏色的區(qū)域,其中:

最理想的是藍(lán)色,一個(gè)像素只繪制一次,合格的頁面繪制是白色、藍(lán)色為主,綠色以上區(qū)域不能超過整個(gè)的三分之一,顏色越淺越好。

那么從設(shè)計(jì)的角度來看你的應(yīng)用是否GPU繪制過度,看一下以下幾個(gè)界面:

從上圖我們可以看出:

Google now頁面GPU繪制比較正常基本都是在1x-2x范圍內(nèi),QQ的繪制情況也還可以,2345手機(jī)助手和2345影視大全過度繪制是很嚴(yán)重的,基本都是超過3x,4x。

可能有些人覺得不以為然,覺得沒什么影響。話又說回來,GPU繪制過渡對(duì)應(yīng)用造成什么影響。

實(shí)際上,GPU繪制影響的是界面的流暢度和用戶體驗(yàn),對(duì)于好的手機(jī)可能體驗(yàn)不到差距,對(duì)于差的手機(jī),流暢度卻起著關(guān)鍵的作用。

可以大部分設(shè)計(jì)師關(guān)注的都是開發(fā)是否有100%還原你的設(shè)計(jì)稿,應(yīng)用的交互體驗(yàn)是否良好,沒有幾個(gè)設(shè)計(jì)師會(huì)去關(guān)注GPU過度繪制問題。

本人接觸到這方面知識(shí)也是優(yōu)化我們開發(fā)人員指導(dǎo),當(dāng)時(shí)我們正在做界面層級(jí)簡化,而應(yīng)用界面出現(xiàn)了2種背景顏色,如圖(左邊的背景為白色,右邊的背景為淺灰)。

開發(fā)讓我們梳理一下頁面層級(jí),得出右邊的管理頁面要再多繪制一層;

開發(fā)人員建議我們以后在設(shè)計(jì)中,梳理一下頁面之前層級(jí)關(guān)系,盡量保持整個(gè)界面的架構(gòu)統(tǒng)一,大背景色一致性。而且開發(fā)人員在開發(fā)過程中,盡量用簡化的結(jié)構(gòu)來布局,保持界面還原度的同時(shí)也要考慮界面的流暢度。

列舉一下我們2345王牌助手首頁界面前后優(yōu)化對(duì)比,看了以后,感覺整個(gè)人的心情都好了有木有啊,感覺更高大上了很多。

經(jīng)過優(yōu)化后的頁面一次繪制時(shí)間能提升3ms-5ms,可以看下面這張圖來進(jìn)行對(duì)比,綠色色塊部分為提升空間。

這次優(yōu)化工作對(duì)我來說,是一次寶貴的經(jīng)驗(yàn),我們一直在努力讓設(shè)計(jì)變得更好,但有時(shí)候設(shè)計(jì)不只是表面的美化工作,還是深度的改善用戶體驗(yàn)。在這里我想感慨一下,一個(gè)項(xiàng)目的成功上線,里面不知道有多少酸甜苦辣,不知道有多少人在為之努力,感謝所有工作人員的不懈努力,辛苦你們啦!

總結(jié)原因

1.太多重疊的背景

重疊著的背景有時(shí)候是有必要的,有時(shí)候是沒必要的。這要視你的項(xiàng)目具體情況而定。

2.太多疊加的View

或者本來這個(gè)UI布局就很復(fù)雜或者你是為了追求一個(gè)炫麗的視覺效果,這都有可能使得很多view疊加在一起。這個(gè)情況非常普遍,下面的建議中會(huì)談?wù)勗趺礈p少這種情況帶來的影響。

3.復(fù)雜的Layout層級(jí)

復(fù)雜的層級(jí)關(guān)系,這個(gè)在布局中也很常見,下面也會(huì)說這種情況怎么做可以盡可能的減少過度繪制。

建議:

1.太多重疊的背景

這個(gè)問題其實(shí)最容易解決,建議前期在設(shè)計(jì)時(shí)盡量保持整體背景統(tǒng)一,另外開發(fā)可以檢查你在布局和代碼中設(shè)置的背景,有些背景是被隱藏在底下的,它永遠(yuǎn)不可能顯示出來,這種沒必要的背景一定要移除,因?yàn)樗芸赡軙?huì)嚴(yán)重影響到app的性能。

2.太多重疊的view

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

3.復(fù)雜的Layout層級(jí)

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平阴县| 南靖县| 元阳县| 乐亭县| 浦江县| 木兰县| 天柱县| 桃江县| 鲁山县| 肥东县| 富宁县| 鹰潭市| 玉屏| 五莲县| 边坝县| 措勤县| 且末县| 哈尔滨市| 儋州市| 岑溪市| 宜良县| 浪卡子县| 城口县| 普格县| 武胜县| 商丘市| 昌乐县| 邢台市| 贡觉县| 海城市| 绥阳县| 稷山县| 博兴县| 武胜县| 安泽县| 德化县| 彭泽县| 综艺| 乌兰察布市| 禹州市| 邹平县|