瀏覽器渲染/重繪/回流/阻塞

眾所周知软免,網(wǎng)頁不僅應(yīng)該被快速加載吊洼,同時還應(yīng)該流暢運(yùn)行奸远,比如快速響應(yīng)的交互磅氨,如絲般順滑的動畫……

一. GPU 加速能做什么尺栖?

首先我們要了解什么是 16ms 優(yōu)化

大多數(shù)設(shè)備的刷新頻率是 60 次/秒,(1000/60 = 16.6ms)也就說是瀏覽器對每一幀畫面的渲染工作要在 16ms 內(nèi)完成烦租,超出這個時間延赌,頁面的渲染就會出現(xiàn)卡頓現(xiàn)象,影響用戶體驗叉橱。

瀏覽器在一幀里面挫以,會依次執(zhí)行以下這些動作。減少或者避免 layout窃祝,paint 可以讓頁面不卡頓掐松,動畫效果更加流暢。

JavaScript:JavaScript 實現(xiàn)動畫效果粪小,DOM 元素操作等大磺。

Style(計算樣式):確定每個 DOM 元素應(yīng)該應(yīng)用什么 CSS 規(guī)則。

Layout(布局):計算每個 DOM 元素在最終屏幕上顯示的大小和位置探膊。由于 web 頁面的元素布局是相對的量没,所以其中任意一個元素的位置發(fā)生變化,都會聯(lián)動的引起其他元素發(fā)生變化突想,這個過程叫 reflow。

Paint(繪制):在多個層上繪制 DOM 元素的的文字究抓、顏色猾担、圖像、邊框和陰影等刺下。

Composite(渲染層合并):按照合理的順序合并圖層然后顯示到屏幕上绑嘹。

利用 GPU 加速優(yōu)先使用渲染層合并屬性,避免 layout橘茉,paint工腋。

從上圖可以看出姨丈,可以通過改變元素的 transform 實現(xiàn)移動,伸縮變換而非改變物體的 left擅腰,top蟋恬,width,height 避免 layout趁冈,paint歼争。讓動畫效果更加流暢。


@keyframesdemo {

? 0% {

top:10px;

? }

? 100% {

top:30px;

? }

}

優(yōu)化


@keyframesdemo {

? 0% {

transform:translateY(10px);

? }

? 100% {

transform:translateY(30px);

? }

}

二. GPU 是什么渗勘,如何用 Chrome devtools 進(jìn)行分析 debug沐绒?

瀏覽器渲染一個頁面大致是按照下面這個步驟執(zhí)行。

獲取 DOM 并將其分割為多個層(RenderLayer)

將每個層?xùn)鸥窕梗ⅹ?dú)立的繪制進(jìn)位圖中

將這些位圖作為紋理上傳至 GPU

復(fù)合多個層來生成最終的屏幕圖像(終極 layer )乔遮。

Chrome 開啟查看 renderlayer

按上面的步驟之后,即可看到

黃色邊框:有動畫 3d 變換的元素取刃,表示放到了一個新的復(fù)合層(composited layer)中渲染

藍(lán)色的柵格:這些分塊可以看作是比層更低一級的單位蹋肮,這些區(qū)域就是 RenderLayer

打開一個頁面,如果該頁面的黃色邊框很多蝉衣,那么肯定要查看一下原因了

Chrome 查看 layer

打開 timeline 進(jìn)行錄制括尸,選中 timeline 的某一幀,然后選擇下面的 layer 病毡,可以左右拖動該模塊出現(xiàn) 3d濒翻。

我們可以看到一個頁面實際是像下面一樣組成的

從上圖不難理解,雖然我們最終在瀏覽器上看到的只是一個復(fù)印版啦膜,即最終只有一個層有送。類似于PhotoShop軟件中的“圖層”概念,最后合并所有可視圖層僧家,輸出一張圖片到屏幕上雀摘。但實際上一些dom會因為一些規(guī)則被提升成獨(dú)立的層(開啟 GPU 加速),一旦被獨(dú)立出來之后八拱,便不會再影響其他dom的布局阵赠,因為它改變之后,只是“貼上”了頁面肌稻。

根據(jù)這個優(yōu)點(diǎn)清蚀,我們可以把頁面中一些布局經(jīng)常變換的dom(動畫)提升到獨(dú)立的層。那么爹谭,瀏覽器在之后的 16ms 中枷邪,只需進(jìn)行下面的幾個步驟。

三. 如何開啟 GPU 加速诺凡?

目前下面這些因素都會引起Chrome創(chuàng)建合成層:

3D 或透視變換(perspective东揣,transform) CSS 屬性

使用加速視頻解碼的video元素

擁有 3D (WebGL) 上下文或加速的 2D 上下文的 canvas 元素

混合插件(如 Flash)

對自己的 opacity 做 CSS 動畫或使用一個動畫 webkit 變換的元素

擁有加速 CSS 過濾器的元素

元素A有一個 z-index 比自己小的元素B践惑,且元素B是一個合成層(換句話說就是該元素在復(fù)合層上面渲染),則元素A會提升為合成層

上面6點(diǎn)都非常容易理解嘶卧,在日常開發(fā)中尔觉,最容易出現(xiàn)問題的是第7點(diǎn)

四. GPU 加速隱藏的坑–隱式合成

元素A有一個 z-index 比自己小的元素B,且元素B是一個合成層(換句話說就是該元素在復(fù)合層上面渲染)

拿實際項目舉個栗子脸候,我們按照上面的步驟開啟 layer borders

尚未給上圖右手添加高層級的 z-index 時穷娱,整個頁面在移動端打開后閃退。而添加了 z-index 之后运沦,頁面正常顯示泵额,不閃退了。

仔細(xì)看上面的 gif 携添,僅僅改變了 z-index 嫁盲,就會改變大批數(shù)量的層(黃色邊框)

為什么 z-index 力量這么大?

我們來看一個栗子烈掠,B 在做動畫羞秤,理所當(dāng)然把B提到單獨(dú)的合成層。減少重繪左敌。

按照上圖瘾蛋,我們遇到一個邏輯問題,元素B應(yīng)該在單獨(dú)的合成層上矫限,并且屏幕的最終圖像應(yīng)該在 GPU 上組成哺哼。但是A元素在B元素的頂部,我們沒有指定提升A元素自身層級的東西叼风。那么瀏覽器會做什么取董?它將強(qiáng)制為元素A創(chuàng)建一個新的合成圖層。

這樣无宿,A和B都被提升到單獨(dú)的復(fù)合層茵汰。

因此,使用 GPU 加速提升動畫性能時孽鸡,最好給當(dāng)前動畫元素增加一個高一點(diǎn)的 z-index 屬性蹂午,人為干擾復(fù)合層的排序,可以有效減少 Chrome 創(chuàng)建不必要的復(fù)合層画侣,提升渲染性能。

注意:GPU 不僅需要發(fā)送渲染層圖像到 GPU 堡妒,而且還需存儲它們溉卓,以便稍后在動畫中重用搬泥。別盲目創(chuàng)建渲染層伏尼,一定要分析其實際性能表現(xiàn)。因為創(chuàng)建渲染層是有代價的爆阶,每創(chuàng)建一個新的渲染層燥透,就意味著新的內(nèi)存分配和更復(fù)雜的層的管理辨图。對于使用移動設(shè)備的用戶來說是很坑的。移動設(shè)備沒有臺式機(jī)那么多的內(nèi)存故河。過多的 GPU 加速會引起頁面卡頓甚至閃退吱韭。

找到 layers,點(diǎn)擊當(dāng)前層鱼的,在右邊查看占用的 memory(內(nèi)存)

總結(jié)

整篇文章介紹了下面幾個部分

GPU 加速能做什么

GPU 是什么理盆,如何用 Chrome devtools 進(jìn)行分析 debug?

如何開啟 GPU 加速凑阶?

GPU 加速隱藏的坑–隱式合成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿规,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宙橱,更是在濱河造成了極大的恐慌姨俩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件养匈,死亡現(xiàn)場離奇詭異哼勇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呕乎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門积担,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猬仁,你說我怎么就攤上這事帝璧。” “怎么了湿刽?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵的烁,是天一觀的道長。 經(jīng)常有香客問我诈闺,道長渴庆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮襟雷,結(jié)果婚禮上刃滓,老公的妹妹穿的比我還像新娘。我一直安慰自己耸弄,他們只是感情好咧虎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著计呈,像睡著了一般砰诵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捌显,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天茁彭,我揣著相機(jī)與錄音,去河邊找鬼苇瓣。 笑死尉间,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的击罪。 我是一名探鬼主播哲嘲,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媳禁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囱怕?” 一聲冷哼從身側(cè)響起毫别,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤岛宦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砾肺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侠坎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年实胸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涮瞻。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖近顷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窒升,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布域醇,位于F島的核電站譬挚,受9級特大地震影響酪呻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玩荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一阶冈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧填具,春花似錦堂飞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至年叮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間只损,已是汗流浹背七咧。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工艾栋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝗砾。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓悼粮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霉翔。 傳聞我的和親對象是個殘疾皇子苞笨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355