摘要:動(dòng)畫卡頓解決方案前端時(shí)間用實(shí)現(xiàn)頁(yè)面中首頁(yè)動(dòng)畫過(guò)渡,很簡(jiǎn)單的一個(gè)效果,首頁(yè)加載一個(gè)客服頭像,先放大,停留后再縮小至頂部。參考文章深入瀏覽器理解和的性能問(wèn)題解決動(dòng)畫卡頓的辦法
CSS3 動(dòng)畫卡頓解決方案
前端時(shí)間用animation實(shí)現(xiàn)H5頁(yè)面中首頁(yè)動(dòng)畫過(guò)渡,很簡(jiǎn)單的一個(gè)效果,首頁(yè)加載一個(gè)客服頭像,先放大,停留700ms后再縮小至頂部。代碼如下
首頁(yè)加載動(dòng)畫
在chrome上測(cè)試ok,但在提測(cè)給QA的時(shí)候發(fā)現(xiàn)部分機(jī)型,如華為,系統(tǒng)4.2,oppo系統(tǒng)5.1的出現(xiàn)卡頓情況。
百思不得其解,后來(lái)參考文章深入瀏覽器理解CSS animations 和 transitions的性能問(wèn)題一文,將圖片縮放中動(dòng)畫元素改成transform,如下
@-webkit-keyframes imgSmall{ 0%{ -webkit-transform:scale(1); } 100%{ -webkit-transform:scale(.465); } }
果然啊,卡頓問(wèn)題解決了。
文章深入瀏覽器理解CSS animations 和 transitions的性能問(wèn)題是這么解釋的,現(xiàn)代的瀏覽器通常會(huì)有兩個(gè)重要的執(zhí)行線程,這2個(gè)線程協(xié)同工作來(lái)渲染一個(gè)網(wǎng)頁(yè):主線程和合成線程。
一般情況下,主線程負(fù)責(zé):運(yùn)行JavaScript;計(jì)算HTML 元素的 CSS 樣式;頁(yè)面的布局;將元素繪制到一個(gè)或多個(gè)位圖中;將這些位圖交給合成線程。
相應(yīng)地,合成線程負(fù)責(zé):通過(guò) GPU將位圖繪制到屏幕上;通知主線程更新頁(yè)面中可見(jiàn)或即將變成可見(jiàn)的部分的位圖;計(jì)算出頁(yè)面中哪部分是可見(jiàn)的;計(jì)算出當(dāng)你在滾動(dòng)頁(yè)面時(shí)哪部分是即將變成可見(jiàn)的;當(dāng)你滾動(dòng)頁(yè)面時(shí)將相應(yīng)位置的元素移動(dòng)到可視區(qū)域。
假設(shè)我們要一個(gè)元素的height從 100 px 變成 200 px,就像這樣:
div { height: 100px; transition: height 1s linear; } div:hover { height: 200px; }
主線程和合成線程將按照下面的流程圖執(zhí)行相應(yīng)的操作。注意在橘黃色方框的操作可能會(huì)比較耗時(shí),在藍(lán)色框中的操作是比較快速的。
而使用transform:scale實(shí)現(xiàn)
div { transform: scale(0.5); transition: transform 1s linear; } div:hover { transform: scale(1.0); }
此時(shí)流程如下:
也就是說(shuō),使用transform,瀏覽器只需要一次生成這個(gè)元素的位圖,并在動(dòng)畫開始的時(shí)候?qū)⑺峤唤oGPU去處理 。之后,瀏覽器不需要再做任何布局、 繪制以及提交位圖的操作。從而,瀏覽器可以充分利用 GPU 的特長(zhǎng)去快速地將位圖繪制在不同的位置、執(zhí)行旋轉(zhuǎn)或縮放處理。
為了從數(shù)量級(jí)上去證實(shí)這個(gè)理論,我打開chrome的Timeline查看頁(yè)面FPS
其中,當(dāng)用height做動(dòng)畫元素時(shí),在切換過(guò)程的FPS只有44,我們知道每秒60幀是最適合人眼的交互,小于60,人眼能明顯感覺(jué)到,這就是為什么卡頓的原因。
rendering和painting所花的時(shí)間如下:
再來(lái)看看用transform:scale
FPS達(dá)到66,且rendering和painting時(shí)間減少了3倍。
到此為止問(wèn)題是解決了,隔了幾天,看到一篇解決Chrome動(dòng)畫”卡頓”的辦法,發(fā)現(xiàn)還能通過(guò)開啟硬件加速的方式優(yōu)化動(dòng)畫,于是又試了一遍。
webkit-transform: translate3d(0,0,0); -moz-transform: translate3d(0,0,0); -ms-transform: translate3d(0,0,0); -o-transform: translate3d(0,0,0); transform: translate3d(0,0,0);
驚人的事情發(fā)生了,F(xiàn)PS達(dá)到72:
總結(jié)解決CSS3動(dòng)畫卡頓方案盡量使用transform當(dāng)成動(dòng)畫熟悉,避免使用height,width,margin,padding等;
要求較高時(shí),可以開啟瀏覽器開啟GPU硬件加速。
參考文章深入瀏覽器理解CSS animations 和 transitions的性能問(wèn)題
解決Chrome動(dòng)畫”卡頓”的辦法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80180.html
摘要:動(dòng)畫卡頓解決方案前端時(shí)間用實(shí)現(xiàn)頁(yè)面中首頁(yè)動(dòng)畫過(guò)渡,很簡(jiǎn)單的一個(gè)效果,首頁(yè)加載一個(gè)客服頭像,先放大,停留后再縮小至頂部。參考文章深入瀏覽器理解和的性能問(wèn)題解決動(dòng)畫卡頓的辦法 CSS3 動(dòng)畫卡頓解決方案 前端時(shí)間用animation實(shí)現(xiàn)H5頁(yè)面中首頁(yè)動(dòng)畫過(guò)渡,很簡(jiǎn)單的一個(gè)效果,首頁(yè)加載一個(gè)客服頭像,先放大,停留700ms后再縮小至頂部。代碼如下 ...
摘要:據(jù)不完全統(tǒng)計(jì),這五年中,白鷺引擎累計(jì)運(yùn)轉(zhuǎn)的游戲和微信小游戲的流水?dāng)?shù)據(jù)約為億。 我們的引擎架構(gòu)師做某一沙龍活動(dòng)的演講速記,純純的干貨,分享給大家。 王澤:各位開發(fā)者下午好!我叫王澤,是白鷺引擎的首席架構(gòu)師。 今天給大家分享的題目是《重度H5游戲性能優(yōu)化技巧》。之所以決定用這個(gè)題目,是因?yàn)槲易罱鼛字茉趶V深一帶拜訪了很多使用白鷺引擎的開發(fā)者,發(fā)現(xiàn)特別是在廣州一帶,大部分開發(fā)者都在做重度H5游...
摘要:如果你看到我的前一篇文章一篇文章說(shuō)清瀏覽器解析和動(dòng)畫優(yōu)化,理解本篇文章還是很簡(jiǎn)單的。,元素的終止?fàn)顟B(tài)。這會(huì)打斷正在運(yùn)行的動(dòng)畫,這是糟糕的。關(guān)鍵是確保你的預(yù)計(jì)算在用戶響應(yīng)的空閑時(shí)間執(zhí)行,這樣兩個(gè)動(dòng)畫就不會(huì)沖突了。 在vue官方文檔上看到vue使用flip做動(dòng)畫,就去研究了一下。這是一個(gè)準(zhǔn)則,協(xié)調(diào)js和css對(duì)動(dòng)畫的操作。如果你看到我的前一篇文章一篇文章說(shuō)清瀏覽器解析和CSS(GPU)動(dòng)畫...
閱讀 841·2021-09-22 15:18
閱讀 1196·2021-09-09 09:33
閱讀 2766·2019-08-30 10:56
閱讀 1203·2019-08-29 16:30
閱讀 1499·2019-08-29 13:02
閱讀 1471·2019-08-26 13:55
閱讀 1653·2019-08-26 13:41
閱讀 1950·2019-08-26 11:56