首頁 web前端 js教程 如何能做到高效能行動端開發

如何能做到高效能行動端開發

Nov 18, 2017 am 10:53 AM
開發 移動 高效能

眾所周知,行動端不僅應該被快速加載,光有內容沒有用戶體驗也是不可以的,同時還應該流暢運行,比如快速響應的交互,如絲般順滑的動畫……

在實際開發中如何做到上面所說的效果呢?

1. 確認渲染效能的分析標準

2. 準備尺去衡量渲染效能標準

3. 對耗時多的地方進行最佳化

我們可以粗略的得到下面的最佳化目標

如何能做到高效能行動端開發


#第一個是首屏呈現時間,網路上的資料已經非常非常多了,壓縮代碼,使用webp圖片,使用sprite,按需加載,“直出”,CDN……

第二個是16ms 優化,本篇重點講16ms的優化。


一.瀏覽器渲染 原理介紹

#大多數裝置的更新頻率是60次/秒,(1000/60 = 16.6ms)也就說是瀏覽器對每一幀畫面的渲染工作要在16ms內完成,超出這個時間,頁面的渲染就會出現卡頓現象,影響使用者體驗。

這就是上圖的

如何能做到高效能行動端開發

如果改變屬性在上面圖中越往左,那麼影響就越大,效率就越低。

瀏覽器渲染的流程如下:

取得DOM 並將其分割為多個層(RenderLayer)

#將每個層柵格化,並獨立的繪製進位圖中

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

複合多個圖層來產生最終的螢幕影像(終極layer)。

從上面圖可以看出,如果只是改變composite(渲染層合併),那效率就會大大提升。

下面粗略地列出要改變哪些樣式會分別改變渲染過程的哪一模組。

如何能做到高效能行動端開發

從上圖可以看到 transform,opacity 只會改變composite(渲染層合併),為什麼呢?因為開啟了GPU加速。

開啟GPU 加速

字面上的解釋: 紋理能夠以很低的代價映射到不同的位置,而且還能夠以很低的代價透過把它們應用到一個非常簡單的矩形網格中進行變形。

【字面上的理解非常地繞口,還是老道理,能用圖講清的道理不要用文字。 】

小tips:先選取timeline的某一幀,然後選擇下面的layer標籤tab,可以左右拖曳該模組出現3d

我們可以看到頁面上由如下層組成:

如何能做到高效能行動端開發

雖然我們最終在瀏覽器上看到的只是一個影印版,也就是最終只有一個層。類似於PhotoShop軟體中的「圖層」概念,最後合併所有可視圖層,輸出一張圖片到螢幕上

但是實際上一個頁面會因為有些規則被分成對應的層,一旦被獨立出來之後,便不會再影響其他dom的佈局,因為它改變之後,只是「貼上」了頁面。

目前下面這些因素都會造成Chrome建立層:

3D 或透視轉換(perspective transform) CSS 屬性

使用加速影片解碼的

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

混合插件(如Flash)

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

擁有加速CSS 過濾器的元素

元素有一個包含複合層的後代節點(換句話說,就是一個元素擁有一個子元素,該子元素在自己的層裡)

元素有一個z-index 較低且包含一個複合層的兄弟元素(換句話說就是該元素在複合層上面渲染)

在webkit核心的瀏覽器中,如果有上述情況,則會建立一個獨立的layer。

要注意的是,不要建立過多的渲染層,這意味著新的記憶體分配和更複雜的層管理。不要濫用GPU加速,注意看 composite layouts 是否超出了 16ms

如何能做到高效能行動端開發

說了這麼多瀏覽器渲染的原理,如果沒有尺測量也毫無用處。那麼,下面就選尺去測量:Google開發工具的Timeline。


二. Google開發工具Timeline 的常用功能


1. 點擊左上角的錄製之後,錄製結束之後會產生下面的樣子,紅色區域內就是幀了,移動上去可以看到每一幀的頻率,如果>60fps,就是比較流暢,如果。

如何能做到高效能行動端開發


2. 在timeline下面,可以看到各個模組的耗時,可以定位到耗時較大的函數上面,對該函數進行最佳化。

如何能做到高效能行動端開發


3. 依照下面步驟選擇,即可看到獨立的層,高亮重繪的區域,方便找出不必要重繪的區域,進行最佳化

如何能做到高效能行動端開發

選擇之後,目前頁面會出現下面2中顏色邊框

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

藍色的柵格:這些分塊可以看作是比層更低一級的單位,Chrome以這些分塊為單位,一次上傳一個分塊的內容到GPU。

工具也有了,瀏覽器渲染的原理也知道了,接下來是結合實際專案進行最佳化.


三. 在實際專案中進行16.6ms 最佳化

結合上面的渲染流程圖,我們可以針對性的分析並優化下面的一些步驟

優化JavaScript的執行效率

#降低樣式計算的範圍和複雜度

避免大規模、複雜的佈局

簡化繪製的複雜度、減少繪製區域

優先使用渲染層合併屬性、控制層數量

對使用者輸入事件的處理函數去抖動(行動裝置)


#1. 讀寫分離,大量操作 

JavaScript腳本運行的時候,它能取得的元素樣式屬性值都是上一格畫面的,都是舊的值。

因此,如果你在目前幀取得屬性之前又對元素節點有改動,那就會導致瀏覽器必須先套用屬性修改,結果執行佈局過程,最後再執行JavaScript邏輯。

// 先写后读,触发强制布局
function logBoxHeight() {
    // 更新box样式
    box.classList.add('super-big');
 
    // 为了返回box的offersetHeight值
    // 浏览器必须先应用属性修改,接着执行布局过程
    console.log(box.offsetHeight);
}
登入後複製

優化之後:

// 先读后写,避免强制布局
function logBoxHeight() {
    // 获取box.offsetHeight
    console.log(box.offsetHeight);
 
    // 更新box样式
    box.classList.add('super-big');
}
登入後複製


2. 閉包快取計算結果  (需要頻繁的調用,計算的函數)

getMaxWidth: (function () {
            var cache = {};
            function getwidth() {
                if (maxWidth in cache) {
                    return cache[maxWidth];
                }
                var target = this.node,
                 width = this.width,
                  screen = document.body.clientWidth,
                   num = target.length,
                  maxWidth = num * width + 10 * num + 20 - screen;
                cache[maxWidth] = maxWidth;
                 return maxWidth;
             }
             return getwidth;
})(),
登入後複製

改成這種方式後,直接蹭蹭~ 減少了10多ms


#3. 對使用者輸入事件的處理函數去抖動

如果被觸摸的元素綁定了輸入事件處理函數,例如touchstart/touchmove/touchend,那麼渲染層合併線程必須等待這些被綁定的處理函數執行完畢才能執行,也就是使用者的滾動頁面操作被阻塞了,表現出的行為就是滾動出現延遲或卡頓。

簡而言之就是你必須確保使用者輸入事件綁定的任何處理函數都能夠快速的執行完畢,以便騰出時間來讓渲染層合併線程完成他的工作。

輸入事件處理函數,例如scroll/touch事件的處理,都會在requestAnimationFrame之前被呼叫執行。因此,如果你在上述輸入事件的處理函數中做了修改樣式屬性的操作,那麼這些操作就會被瀏覽器暫存起來。

然後在呼叫requestAnimationFrame的時候,如果你在一開始就做了讀取樣式屬性的操作,那麼將會觸發瀏覽器的強制同步佈局操作(即在javascript階段中執行佈局),這樣會導致多次佈局,效率低。

優化如下:

window.requestAnimationFrame(function () {
    context.animateTo(nowPos);  //需要更新位置的交给RAF
});
登入後複製


4. 減少不必要的重繪

#續上面,開啟paint flashing 之後,可以看到瀏覽器重新繪製了哪些區域。發現有些不必要重繪的區域也重繪了~給這些開啟GPU優化(上文中提到)

#直接看timeline 效果,全綠了~懸著的心終於放下了

如何能做到高效能行動端開發

如何能做到高效能行動端開發

行動端開發的小技巧很多,今天先帶給大家這個高效能開發的技巧,更多知識請繼續關注我們網站PHP.cn

相關閱讀:

行動端開發之處理手機裝置的橫直螢幕

行動端開發必備知識( 轉載)_html/css_WEB-ITnose

#行動端開發的一些技巧_html/css_WEB-ITnose

以上是如何能做到高效能行動端開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
四款值得推薦的AI輔助程式工具 四款值得推薦的AI輔助程式工具 Apr 22, 2024 pm 05:34 PM

這個AI輔助程式工具在這個AI快速發展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設計工具能夠提升開發效率、提升程式碼品質、降低bug率,是現代軟體開發過程中的重要助手。今天大姚給大家分享4款AI輔助程式工具(而且都支援C#語言),希望對大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協作上。 Git

6000 毫安矽負極電池!小米 15Pro 升級再曝料 6000 毫安矽負極電池!小米 15Pro 升級再曝料 Jul 24, 2024 pm 12:45 PM

7月23日消息,部落客數位閒聊站爆料稱,小米15Pro電池容量增大至6000mAh,支援90W有線閃充,這將是小米數位系列電池最大的Pro機型。先前數位閒聊站透露,小米15Pro的電池擁有超高能量密度,矽含量遠高於競品。矽基電池在2023年大規模試水後,第二代矽負極電池被認定為產業未來發展方向,今年將迎來直接競爭的高峰。 1.矽的理論克容量可達4200mAh/g,是石墨克容量的10倍以上(石墨的理論克容量372mAh/g)。對於負極而言,當鋰離子嵌入量達到最大時的容量為理論克容量,這意味著在相同重量下

AI程式設計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 AI程式設計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 Apr 07, 2024 am 09:10 AM

2022年3月3日,距離世界首個AI程式設計師Devin誕生不足一個月,普林斯頓大學的NLP團隊開發了一個開源AI程式設計師SWE-agent。它利用GPT-4模型在GitHub儲存庫中自動解決問題。 SWE-agent在SWE-bench測試集上的表現與Devin相似,平均耗時93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內容,使用自動語法檢查、編輯特定行,以及編寫和執行測試。 (註:以上內容為原始內容微調,但保留了原文中的關鍵訊息,未超過指定字數限制。)SWE-A

學習如何利用Go語言開發行動應用程式 學習如何利用Go語言開發行動應用程式 Mar 28, 2024 pm 10:00 PM

Go語言開發行動應用程式教學隨著行動應用程式市場的不斷蓬勃發展,越來越多的開發者開始探索如何利用Go語言開發行動應用程式。作為一種簡潔高效的程式語言,Go語言在行動應用開發中也展現了強大的潛力。本文將詳細介紹如何利用Go語言開發行動應用程序,並附上具體的程式碼範例,幫助讀者快速入門並開始開發自己的行動應用程式。一、準備工作在開始之前,我們需要準備好開發環境和工具。首

國產FPS新王炸! 《三角洲行動》大戰場超乎預期 國產FPS新王炸! 《三角洲行動》大戰場超乎預期 Mar 07, 2024 am 09:37 AM

《三角洲行動》將在今日(3月7日)開啟一場名為「代號:ZERO」的大規模PC測試。而在上週末,這款遊戲在上海舉辦了一次線下快閃體驗活動,17173也有幸受邀參與其中。這次測試距離上一次僅相隔四個多月,不禁讓我們好奇,在這麼短的時間內,《三角洲行動》將會帶來哪些新的亮點與驚喜?四個多月前,我已先行在線下品鑑會和首測版本中體驗了《三角洲行動》。當時,遊戲僅開放了「危險行動」這個模式。然而,《三角洲行動》在當時的表現已然令人矚目。在各大廠商紛紛湧向手遊市場的背景下,如此一款與國際水準相媲美的FPS

Android開發最適合的Linux發行版是哪一個? Android開發最適合的Linux發行版是哪一個? Mar 14, 2024 pm 12:30 PM

Android開發是一項繁忙而又令人興奮的工作,而選擇適合的Linux發行版來進行開發則顯得尤為重要。在眾多的Linux發行版中,究竟哪一個最適合Android開發呢?本文將從幾個方面來探討這個問題,並給出具體的程式碼範例。首先,我們來看看目前流行的幾個Linux發行版:Ubuntu、Fedora、Debian、CentOS等,它們都有各自的優點和特點。

Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

榮耀 Magic6 RSR 保時捷設計正式開賣 1TB 售 9999 元 榮耀 Magic6 RSR 保時捷設計正式開賣 1TB 售 9999 元 Mar 22, 2024 pm 03:03 PM

日前,榮耀手機舉辦了新品發表會,正式推出了榮耀Magic6RSR保時捷設計。 3月22日,CNMO了解到,榮耀Magic6RSR保時捷設計正式開售,僅提供24GB+1TB一種版本,售價9,999元。榮耀Magic6RSR採用了保時捷設計的外觀,靈感源自保時捷超級跑車的經典元素。背部線條設計靈感來自保時捷飛線式設計,相機模組則採用標誌性的六角形設計,讓產品擁有鮮明的立體感和動感。此外,產品提供了保時捷原廠大師調色的瑪瑙灰和冰莓粉兩款配色,更加彰顯其獨特的設計美感。在螢幕技術上,榮耀Magic6RSR保

See all articles