摘要:但硬件加速是把雙刃劍,過渡的使用硬件加速會(huì)適得其反。所以,一定要牢記不要讓頁面的每個(gè)元素都使用硬件加速,當(dāng)且僅當(dāng)需要的時(shí)候才為元素創(chuàng)建渲染層。參考文檔無線性能優(yōu)化動(dòng)畫及硬件加速高性能動(dòng)畫與頁面渲染渲染優(yōu)化層模型
前言
談起瀏覽器的硬件加速,想必大家都知道的一個(gè)技巧就是在用CSS3做動(dòng)畫時(shí),給元素添加transform: translateZ(0)或者transform: translate3d(0, 0, 0)就會(huì)開啟GPU的硬件加速,將本來應(yīng)該是瀏覽器處理的動(dòng)畫效果轉(zhuǎn)交給GPU處理,從而使得動(dòng)畫看起來更加順暢,在移動(dòng)端體驗(yàn)更好。本文將進(jìn)一步探索其中的奧秘,例如哪些條件可以觸發(fā)GPU硬件加速?硬件加速背后的工作原理是什么?是不是開啟GPU硬件加速的動(dòng)畫應(yīng)該越多越好?
首先讓我們來看一個(gè)動(dòng)畫效果,通過CSS3的animation屬性來實(shí)現(xiàn)讓一個(gè)小球從坐到右移動(dòng)200px的距離。現(xiàn)在有兩種實(shí)現(xiàn)方式:
第一種方法通過改變?cè)撛氐膖op屬性來實(shí)現(xiàn):
.ball1{ width:100px; height:100px; border-radius: 100px; background:red; } .ball1{ animation:mymove 3s infinite linear; -moz-animation:mymove 3s infinite linear; -webkit-animation:mymove 3s infinite linear; -o-animation:mymove 3s infinite linear; } @keyframes mymove{ from {top:0px;} to {top:200px;} }
第二種方法通過translate來實(shí)現(xiàn):
.ball1{ animation:translateMove 3s infinite linear; -moz-animation:translateMove 3s infinite linear; -webkit-animation:translateMove 3s infinite linear; -o-animation:translateMove 3s infinite linear; } @keyframes translateMove { from {transform: translate3d(0,0,0);} to {transform: translate3d(0,200px,0)} }
兩種方式都能達(dá)到同樣的效果,但瀏覽器在內(nèi)部渲染的過程卻大不相同。哪種實(shí)現(xiàn)方式更優(yōu)?在回答這個(gè)問題之前,我們先來了解一下瀏覽器的渲染過程。
瀏覽器渲染過程已知JS是單線程工作的,但是瀏覽器可以開啟多個(gè)線程,渲染一個(gè)網(wǎng)頁需要兩個(gè)重要的線程來共同完成:Main Thread 主線程 Compositor Thread 合成器線程
主線程做的工作:運(yùn)行JS 計(jì)算 HTML 元素的 CSS 樣式 布局頁面 將元素繪制到一個(gè)或多個(gè)位圖中 把這些位圖交給 Compositor Thread 來處理合成器線程做的工作:
通過 GPU 將位圖繪制到屏幕上 通知主線程去更新頁面中可見或即將可見的部分的位圖 計(jì)算出頁面中那些部分是可見的 計(jì)算出在滾動(dòng)頁面時(shí)候,頁面中哪些部分是即將可見的 滾動(dòng)頁面時(shí)將相應(yīng)位置的元素移動(dòng)到可視區(qū)
在了解了這兩個(gè)線程各自負(fù)責(zé)的部分之后,我們?cè)賮砜礊g覽器的渲染過程。大體流程如下:
???
當(dāng)我們通過某種方法引起瀏覽器的reflow時(shí),需要重新經(jīng)歷style和layout階段,導(dǎo)致瀏覽器重新計(jì)算頁面中每個(gè)dom元素的尺寸及重新布局,伴隨著重新進(jìn)行repaint,這個(gè)過程是非常耗時(shí)的。為了把代價(jià)降到最低,當(dāng)然最好只留下composite這一個(gè)步驟最好。假設(shè)當(dāng)我們改變一個(gè)容器的樣式時(shí),影響的只是它自己,并且還無需重繪,直接通過在GPU中改變紋理的屬性來改變樣式,豈不是更好?
如何能使元素達(dá)到這個(gè)效果?就是讓元素?fù)碛凶约旱膶樱╨ayer)。有了層的概念,讓我們從層的概念再來看瀏覽器的渲染過程:
獲取 DOM 并將其分割為多個(gè)層(RenderLayer)
將每個(gè)層?xùn)鸥窕ⅹ?dú)立的繪制進(jìn)位圖中
將這些位圖作為紋理上傳至 GPU
復(fù)合多個(gè)層來生成最終的屏幕圖像(終極layer)
可以將這個(gè)過程理解為設(shè)計(jì)師的Photoshop文件。在ps源文件里,一個(gè)圖像是由若干個(gè)圖層相互疊加而展示出來的。分成多個(gè)圖層的好處就是每個(gè)圖層相對(duì)獨(dú)立,修改方便,對(duì)單個(gè)圖層的修改不會(huì)影響到頁面上的其他圖層。因此層(layer)存在的意義在于:用最小的代價(jià)來改變某個(gè)頁面元素。可以將某個(gè)css動(dòng)畫或某個(gè)js交互效果抽離到一個(gè)多帶帶的渲染層,來達(dá)到加速渲染的目的。
那么如何才能創(chuàng)建一個(gè)層呢?3d transform屬性
backface-visibility為hidden的元素
使用加速視頻解碼的
擁有 3D (WebGL) 上下文或加速的 2D 上下文的
混合插件(如 Flash)
對(duì) opacity、transform、fliter、backdrop-filter 應(yīng)用了 animation 或者 transition(需要是 active 的 animation 或者 transition,當(dāng) animation 或者 transition 效果未開始或結(jié)束后,合成層也會(huì)失效)
will-change 設(shè)置為 opacity、transform、top、left、bottom、right(其中 top、left 等需要設(shè)置明確的定位屬性,如 relative 等)
元素有一個(gè)包含復(fù)合層的后代節(jié)點(diǎn)(換句話說,就是一個(gè)元素?fù)碛幸粋€(gè)子元素,該子元素在自己的層里)
元素有一個(gè) z-index 較低且包含一個(gè)復(fù)合層的兄弟元素(換句話說就是該元素在復(fù)合層上面渲染)
在webkit內(nèi)核的瀏覽器中,如果有上述情況,就會(huì)創(chuàng)建一個(gè)獨(dú)立的層(layer)。我們可以借助chrome瀏覽器開發(fā)者工具中的layers和rendering結(jié)合來查看頁面中有哪些獨(dú)立的層。
性能分析現(xiàn)在回到文章開始的那個(gè)動(dòng)畫效果,讓我們通過chrome的performance工具來看看具體的執(zhí)行過程。(注:本次性能分析是將CPU性能將至原來的六分之一 模擬移動(dòng)端的效果進(jìn)行分析的。具體操作可將performance工具中的CPU選擇6*slowdown)
通過改變top屬性:
通過改變transform屬性:
從上圖可以看出,運(yùn)動(dòng)的元素如何沒有獨(dú)立的層,每一幀的繪制都需要經(jīng)過不停的rendering和painting過程。
但硬件加速是把雙刃劍,過渡的使用硬件加速會(huì)適得其反。其影響表現(xiàn)在:
內(nèi)存。創(chuàng)建一個(gè)新的渲染層,需要消耗額外的內(nèi)存和管理資源,如果渲染層的個(gè)數(shù)過多,很容易引起內(nèi)存問題,這一點(diǎn)在移動(dòng)端瀏覽器上尤為明顯,可以引起電池耗電量的上升,降低電池的壽命。所以,一定要牢記不要讓頁面的每個(gè)元素都使用硬件加速,當(dāng)且僅當(dāng)需要的時(shí)候才為元素創(chuàng)建渲染層。
使用GPU渲染會(huì)影響字體的抗鋸齒效果。文本在動(dòng)畫期間有可能會(huì)顯示的模糊。
參考文檔無線性能優(yōu)化:composite
CSS動(dòng)畫及硬件加速
Javascript高性能動(dòng)畫與頁面渲染
chrome渲染優(yōu)化-層模型
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93557.html
摘要:今天分享的主題是阿里七層流量入口硬件加速探索之路。業(yè)務(wù)驅(qū)動(dòng)了技術(shù)創(chuàng)新,年接入層在硬件加速領(lǐng)域邁出了第一步。三監(jiān)控,對(duì)硬件加速相關(guān)的資源指標(biāo)進(jìn)行實(shí)時(shí)監(jiān)控和報(bào)警,防患于未然。硬件加速效果上線后我們獲得了一些加速效果的數(shù)據(jù)。 摘要: Tengine在軟件層面已經(jīng)有了深度的調(diào)試和優(yōu)化經(jīng)驗(yàn),但是在硬件層面,通用處理器(CPU)已經(jīng)進(jìn)入了摩爾定律,有了瓶頸。而在業(yè)務(wù)量突飛猛進(jìn)的當(dāng)下,如何利用硬件來...
摘要:是由華盛頓大學(xué)在讀博士陳天奇等人提出的深度學(xué)習(xí)自動(dòng)代碼生成方法,去年月機(jī)器之心曾對(duì)其進(jìn)行過簡要介紹。目前的堆棧支持多種深度學(xué)習(xí)框架以及主流以及專用深度學(xué)習(xí)加速器。 TVM 是由華盛頓大學(xué)在讀博士陳天奇等人提出的深度學(xué)習(xí)自動(dòng)代碼生成方法,去年 8 月機(jī)器之心曾對(duì)其進(jìn)行過簡要介紹。該技術(shù)能自動(dòng)為大多數(shù)計(jì)算硬件生成可部署優(yōu)化代碼,其性能可與當(dāng)前最優(yōu)的供應(yīng)商提供的優(yōu)化計(jì)算庫相比,且可以適應(yīng)新型專用加...
摘要:書接上文瀏覽器內(nèi)核之渲染基礎(chǔ)硬件加速基礎(chǔ)概念硬件加速技術(shù)是指使用的硬件能力為幫助渲染網(wǎng)頁,在為的作用主要是用來繪制圖形并且性能特別好。包含的節(jié)點(diǎn)表示的是使用硬件加速的元素或者技術(shù)。 showImg(https://segmentfault.com/img/remote/1460000016348971); 微信公眾號(hào):愛寫bugger的阿拉斯加如有問題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你...
摘要:但硬件加速是把雙刃劍,過渡的使用硬件加速會(huì)適得其反。所以,一定要牢記不要讓頁面的每個(gè)元素都使用硬件加速,當(dāng)且僅當(dāng)需要的時(shí)候才為元素創(chuàng)建渲染層。參考文檔無線性能優(yōu)化動(dòng)畫及硬件加速高性能動(dòng)畫與頁面渲染渲染優(yōu)化層模型 前言 談起瀏覽器的硬件加速,想必大家都知道的一個(gè)技巧就是在用CSS3做動(dòng)畫時(shí),給元素添加transform: translateZ(0)或者transform: transla...
閱讀 2881·2021-09-28 09:36
閱讀 3608·2021-09-27 13:59
閱讀 2484·2021-08-31 09:44
閱讀 2278·2019-08-30 15:54
閱讀 2352·2019-08-30 15:44
閱讀 1180·2019-08-30 13:45
閱讀 1223·2019-08-29 18:38
閱讀 1206·2019-08-29 18:37