這篇總結(jié)一下布局優(yōu)化烫饼,內(nèi)容不多。试读。
屏幕刷新機(jī)制
首先了解一下刷新率的概念杠纵。刷新率 Refresh Rate,代表了屏幕在一秒內(nèi)刷新屏幕的次數(shù)钩骇。刷新率跟屏幕硬件有關(guān)比藻,即特定的屏幕只會(huì)有特定刷新率。比如一般電子設(shè)備刷新率為60HZ倘屹。
然后是幀率的概念银亲。幀率 Frame Rate,代表了GPU在一秒內(nèi)操作的屏幕的次數(shù)唐瀑,例如60fps群凶,表示GPU在一秒內(nèi)對(duì)屏幕進(jìn)行了60次渲染。
Android就是通過(guò)VSYNC信號(hào)來(lái)同步UI繪制和動(dòng)畫(huà)哄辣,使得它們可以獲得一個(gè)達(dá)到60fps的固定的幀率请梢。如果刷新率跟幀率不一致(一般是幀率小于刷新率)就會(huì)出現(xiàn)卡頓赠尾。
在上面提到了幀率為60fps。為什么是這個(gè)數(shù)呢毅弧,這是因?yàn)?strong>人眼與大腦之間的協(xié)作無(wú)法感知超過(guò)60fps的畫(huà)面更新气嫁,一般到了60fps,人腦就會(huì)認(rèn)為相當(dāng)流暢了够坐。所以一般就是60fps寸宵。
為了能夠使得APP流暢,我們需要在每一幀以內(nèi)完成所有的CPU與GPU計(jì)算元咙,繪制梯影,渲染等等操作。而一幀在60fps下對(duì)應(yīng)的時(shí)間為 1000ms / 60 ≈ 16.6ms庶香,所以這就是 16ms這個(gè)數(shù)字的由來(lái)甲棍。
優(yōu)化方案
具體到布局上,優(yōu)化的核心無(wú)非就是減少嵌套赶掖,避免過(guò)度繪制感猛。
使用相對(duì)布局或者約束布局,避免使用線性布局
其實(shí)使用“避免”這個(gè)詞也不太妥當(dāng)奢赂,畢竟每一種布局都有其存在的意義陪白。但是 LinearLayout
這個(gè)布局確實(shí)使用起來(lái)局限性挺大。它只適合那種簡(jiǎn)單的行或者列的排布膳灶,稍微復(fù)雜一點(diǎn)的布局使用 LinearLayout
的話咱士,嵌套層級(jí)簡(jiǎn)直慘不忍睹。復(fù)雜一點(diǎn)的布局使用RelativeLayout
或者 ConstraintLayout
是比較好的選擇袖瞻。
尤其是 ConstraintLayout
司致,真的很好用,推薦聋迎。
使用抽象布局標(biāo)簽
抽象布局標(biāo)簽脂矫,指的是 include
merge
ViewStub
這幾個(gè)標(biāo)簽。大家也已經(jīng)很熟悉了霉晕,其作用就是復(fù)用布局庭再,減少嵌套,延遲加載牺堰,總之也是幫助優(yōu)化布局拄轻。使用方法就不贅述了,網(wǎng)上介紹很多伟葫,自己試試就知道了恨搓。
避免在每個(gè)布局上都添加背景
我們布局的時(shí)候,往往喜歡順手給布局添加一個(gè)背景。雖然這樣做可以保證你的布局任何時(shí)候都和設(shè)計(jì)稿一樣斧抱,但是這樣特別影響性能常拓。親身經(jīng)歷,某頁(yè)面非郴云郑卡頓弄抬,去掉了多余的 background
,就流暢很多宪郊。所以掂恕,請(qǐng)去掉不必要的 background
。 你可以給 Activity
定義一個(gè)Theme
弛槐,通過(guò)Theme
定義背景懊亡。
使用LinearLayoutCompat繪制分隔線
之前繪制線性布局的時(shí)候,往往需要給每一項(xiàng)之間繪制一個(gè)分隔線,我們往往都是直接加一個(gè)View
乎串。LinearLayoutCompat
帶有一個(gè) divider
屬性斋配,使用它就可以在布局中生成分隔線了。
這點(diǎn)是我在網(wǎng)上找到的灌闺,自己試了下,發(fā)現(xiàn)不生效坏瞄。有可能是我的用法不太對(duì)吧桂对。不過(guò)現(xiàn)在布局一般都用 ConstraintLayout
了,這個(gè)布局用到的場(chǎng)景也不多鸠匀。
多使用Lint檢查代碼
這個(gè)就不用說(shuō)了蕉斜,跑一遍還是能發(fā)現(xiàn)蠻多問(wèn)題的。關(guān)于布局的問(wèn)題缀棍,主要集中在 Android -> Lint -> Performance
目錄下宅此,里邊提到的問(wèn)題要優(yōu)先解決。另外爬范,阿里代碼規(guī)范也會(huì)檢測(cè)出一些不規(guī)范的問(wèn)題父腕,也要注意一下。