日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

浏览器渲染流水线解析与网页动画性能优化

發(fā)布時(shí)間:2023/12/20 HTML 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浏览器渲染流水线解析与网页动画性能优化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

若干年前,我寫過一篇介紹瀏覽器渲染流水線的文章 - How Rendering Work (in WebKit and Blink),這篇文章,一來部分內(nèi)容已經(jīng)過時(shí),二來缺少一個(gè)全局視角來對流水線整體進(jìn)行分析,所以打算重新寫一篇新的文章,從一個(gè)更高抽象層次和高度簡化的方式對瀏覽器的渲染流水線進(jìn)行解析,能讓大部分頁端同學(xué)都能夠看的明白,并以此作為指引來分析和優(yōu)化頁面的渲染/動畫性能。

有些基本概念如圖層,分塊,光柵化基本沒有發(fā)生變化,如果讀者不理解的話請參考 How Rendering Work (in WebKit and Blink),本文不再過多解釋。

寫這篇文章是始于年初對頁端開發(fā)高性能(交互/動畫) Mobile WebApp 的一些思考,實(shí)際開始寫已經(jīng)是年中… 陸陸續(xù)續(xù)寫了幾個(gè)月才終于寫完。感覺最難的還是開始的部分,要能夠先把基礎(chǔ)的部分講解清楚,然后再循序漸進(jìn)去講解更復(fù)雜的概念。思考了很久,最終決定從幀的概念入手,然后把動畫定義成一個(gè)連續(xù)的幀序列的組合這種方式來對動畫進(jìn)行解析,最終成文的效果還是比較讓自己滿意的。

文章是在作業(yè)部落上寫的的,然后再把 Markdown 貼到其它網(wǎng)站,無法保證每個(gè)網(wǎng)站最終呈現(xiàn)的排版效果,如果讀者覺得排版欠佳,可以訪問在作業(yè)部落上發(fā)布的原網(wǎng)址。

本文基于當(dāng)前版本的 Chrome 瀏覽器寫成(60 左右),理論上部分知識可以應(yīng)用于其它瀏覽器(當(dāng)然術(shù)語會有一定差別)或者 Chrome 后續(xù)的版本,但是并不完全保證這一點(diǎn)。

1. 渲染流水線

上圖顯示了 Chrome 一個(gè)高度簡化后的渲染流水線示意圖:

  • 最底層的是 Chrome 最核心的部分 Blink,負(fù)責(zé)JS的解析執(zhí)行,HTML/CSS解析,DOM操作,排版,圖層樹的構(gòu)建和更新等任務(wù);
  • Layer Compositor(圖層合成器)接收 Blink 的輸入,負(fù)責(zé)圖層樹的管理,圖層的滾動,旋轉(zhuǎn)等矩陣變幻,圖層的分塊,光柵化,紋理上傳等任務(wù);
  • Display Compositor 接收 Layer Compositor 的輸入,負(fù)責(zé)輸出最終的 OpenGL 繪制指令,將網(wǎng)頁內(nèi)容通過 GL 貼圖操作繪制到目標(biāo)窗口上,如果忽略掉操作系統(tǒng)本身的窗口合成器,也可以簡單認(rèn)為是繪制在顯示屏上;
  • 當(dāng)我們說 Compositor,在沒有加修飾語的情況下,一般都是指 Layer Compositor。另外術(shù)語 Child Compositor(子合成器)也是指 Layer Compositor,相對于作為 Parent 的 Display Compositor 而言。

    1.1 進(jìn)程與線程

    一個(gè) Chrome 瀏覽器一般會有一個(gè) Browser 進(jìn)程,一個(gè) GPU 進(jìn)程,和多個(gè) Renderer 進(jìn)程,通常每個(gè) Renderer 進(jìn)程對應(yīng)一個(gè)頁面。在特殊架構(gòu)(Android WebView)或者特定配置下,Browser 進(jìn)程可以兼作 GPU 進(jìn)程或者 Renderer 進(jìn)程(意味著沒有獨(dú)立的 GPU 或者 Renderer 進(jìn)程),但是 Browser 跟 Renderer,Browser 跟 GPU,Renderer 跟 GPU 之間的系統(tǒng)架構(gòu)和通訊方式基本保持不變,線程架構(gòu)也是同樣。

  • Blink 主要運(yùn)行在 Renderer 進(jìn)程的 Renderer 線程,我們通常會稱之為內(nèi)核主線程;
  • Layer Compositor 主要運(yùn)行在 Renderer 進(jìn)程的 Compositor 線程;
  • Display Compositor 主要運(yùn)行在 Browser 進(jìn)程的 UI 線程;
  • Display Compositor 后面應(yīng)該會移到 GPU 進(jìn)程的主 GPU 線程,當(dāng)然對父子合成器進(jìn)行調(diào)度的部分仍然是在 Browser 進(jìn)程的 UI 線程,不太確定各個(gè)不不同平臺的狀況,Android WebView 平臺是已經(jīng)實(shí)現(xiàn)了。

    1.2 幀

    所有的渲染流水線都會有幀的概念,幀這個(gè)概念抽象描述了渲染流水線下級模塊往上級模塊輸出的繪制內(nèi)容相關(guān)數(shù)據(jù)的封裝。我們可以看到 Blink 輸出 Main Frame 給 Layer Compositor,Layer Compositor 輸出 Compositor Frame 給 Display Compositor,Display Compositor 輸出 GL Frame 給 Window。我們覺得一個(gè)動畫是否流暢,最終取決于 GL Frame 的幀率(也就是目標(biāo)窗口的繪制更新頻率),而覺得一個(gè)觸屏操作是否響應(yīng)即時(shí),取決于從 Blink 處理事件到 Window 更新的整個(gè)過程的耗時(shí)(理論上應(yīng)該還要加上事件從 Browser 發(fā)送給 Compositor,再發(fā)送給 Blink 的這個(gè)過程的耗時(shí))。

    1.1.1 Main Frame

    Main Frame 包含了對網(wǎng)頁內(nèi)容的描述,主要以繪圖指令的形式,或者可以簡單理解為某個(gè)時(shí)間點(diǎn)對整個(gè)網(wǎng)頁的一個(gè)矢量圖快照(可以局部更新)。當(dāng)前版本的 Chrome,圖層化的決策仍然由 Blink 來負(fù)責(zé),Blink 需要決定如何根據(jù)網(wǎng)頁的 DOM 樹來生成一顆圖層樹,并以 DisplayList 的形式記錄每個(gè)圖層的內(nèi)容(未來圖層化決策應(yīng)該會轉(zhuǎn)移到 Layer Compositor,Blink 只輸出 DisplayList 樹和 DisplayList 節(jié)點(diǎn)的關(guān)鍵屬性,同時(shí) DisplayList 不再以圖層作為單位,而是以每個(gè)排版對象作為單位)。

    圖層化決策一般由以下幾個(gè)因素決定:

  • 特殊元素如 Plugin,Video,Canvas(WebGL);
  • 維護(hù)正確的層級關(guān)系來保證繪制順序是正確的,比如 Overlap 的計(jì)算;
  • 減少圖層樹的結(jié)構(gòu)變更,減少圖層內(nèi)容的變更(目前 Blink 網(wǎng)頁內(nèi)容的變更是以圖層為原子單位的,如果以一個(gè)元素為根節(jié)點(diǎn)生成圖層,該元素的某些 CSS 屬性如 Transform 的變更不會引起所屬圖層內(nèi)容的變更);
  • 第三點(diǎn)是可以被頁端所直接控制來優(yōu)化圖層結(jié)構(gòu)及 Main Frame 性能,像傳統(tǒng)的 translate3d hack 和新的 CSS 屬性 will-change。

    1.2.2 Compositor Frame

    Layer Compositor 接收 Blink 生成的 Main Frame,并轉(zhuǎn)換成合成器內(nèi)部的圖層樹結(jié)構(gòu)(因?yàn)閳D層化決策仍然由 Blink 負(fù)責(zé),所以這里的轉(zhuǎn)換基本上可以認(rèn)為是生成一棵同樣的樹,再逐個(gè)對圖層進(jìn)行拷貝)。

    Layer Compositor 需要為每個(gè)圖層進(jìn)行分塊,為每個(gè)分塊分配 Resource(Texture 的封裝),然后安排光柵化任務(wù)。

    當(dāng) Layer Compositor 接收到來自 Browser 的繪制請求時(shí),它會為當(dāng)前可見區(qū)域的每個(gè)圖層的每個(gè)分塊生成一個(gè) Draw Quad 的繪制指令(矩形繪制,指令實(shí)際上指定了坐標(biāo),大小,變換矩陣等屬性),所有的 Draw Quad 指令和對應(yīng)的 Resource 的集合就構(gòu)成了 Compositor Frame。Compositor Frame 被發(fā)送往 Browser,并最終到達(dá) Display Compositor(未來也可以直接發(fā)給 Display Compositor)。

    1.2.3 GL Frame

    Display Compositor 將 Compositor Frame 的每個(gè) Draw Quad 繪制指令轉(zhuǎn)換一個(gè) GL 多邊形繪圖指令,使用對應(yīng) Resource 封裝的 Texture 對目標(biāo)窗口進(jìn)行貼圖,這些 GL 繪圖指令的集合就構(gòu)成了一個(gè) GL Frame,最終由 GPU 執(zhí)行這些 GL 指令完成網(wǎng)頁在窗口上占據(jù)的可見區(qū)域的繪制。

    1.3 調(diào)度

    Chrome 渲染流水線的調(diào)度是基于請求和狀態(tài)機(jī)響應(yīng),調(diào)度的最上級中樞運(yùn)行在 Browser UI 線程,它按顯示器的 VSync(垂直同步)周期向 Layer Compositor 發(fā)出輸出下一幀的請求,而 Layer Compositor 根據(jù)自身狀態(tài)機(jī)的狀態(tài)決定是否需要 Blink 輸出下一幀。

    Display Compositor 則比較簡單,它持有一個(gè) Compositor Frame 的隊(duì)列不斷的進(jìn)行取出和繪制,輸出的頻率唯二地取決于 Compositor Frame 的輸入頻率和自身繪制 GL Frame 的耗時(shí)。基本上可以認(rèn)為 Layer Compositor 和 Display Compositor 是生產(chǎn)者和消費(fèi)者的關(guān)系。

    2. 網(wǎng)頁動畫

    動畫可以看做是一個(gè)連續(xù)的幀序列的組合。我們把網(wǎng)頁的動畫分成兩大類 —— 一類是合成器動畫,一類是非合成器動畫(UC 內(nèi)部也將其稱為內(nèi)核動畫或者 Blink Animation,雖然這不是 Chrome 官方的術(shù)語)。

  • 合成器動畫顧名思義,動畫的每一幀都是由 Layer Compositor 生成并輸出的,合成器自身驅(qū)動著整個(gè)動畫的運(yùn)行,在動畫的過程中,不需要新的 Main Frame 輸入;
  • 非合成器動畫,每一幀都是由 Blink 生成,都需要產(chǎn)生一個(gè)新的 Main Frame;
  • 2.1 合成器動畫

    合成器動畫又可以分為兩類:

  • 合成器本身觸發(fā)并運(yùn)行的,比如最常見的網(wǎng)頁慣性滾動,包括整個(gè)網(wǎng)頁或者某個(gè)頁內(nèi)可滾動元素的滾動;
  • Blink 觸發(fā)然后交由合成器運(yùn)行,比如說傳統(tǒng)的 CSS Translation 或者新的 Animation API,如果它們觸發(fā)的動畫經(jīng)由 Blink 判斷可以交由合成器運(yùn)行;
  • Blink 觸發(fā)的動畫,如果是 Transform 和 Opacity 屬性的動畫基本上都可以由合成器運(yùn)行,因?yàn)樗鼈儧]有改變圖層的內(nèi)容。不過即使可以交由合成器運(yùn)行,它們也需要產(chǎn)生一個(gè)新的 Main Frame 提交給合成器來觸發(fā)這個(gè)動畫,如果這個(gè) Main Frame 包含了大量的圖層變更,也會導(dǎo)致觸發(fā)的瞬間卡頓,頁端事先對圖層結(jié)構(gòu)進(jìn)行優(yōu)化可以避免這個(gè)問題。

    2.2 非合成器動畫

    非合成器動畫也可以分為兩類:

  • 使用 CSS Translation 或者 Animation API 創(chuàng)建的動畫,但是無法由合成器運(yùn)行;
  • 使用 Timer 或者 RAF 由 JS 驅(qū)動的動畫,比較典型的就是 Canvas/WebGL 游戲,這種動畫實(shí)際上是由頁端自己定義的,瀏覽器本身并沒有對應(yīng)的動畫的概念,也就是說瀏覽器本身是不知道這個(gè)動畫什么時(shí)候開始,是否正在運(yùn)行,什么時(shí)候結(jié)束,這些完全是頁端自己的內(nèi)部邏輯;
  • 合成器動畫和非合成器動畫在渲染流水線上有較大的差異,后者更復(fù)雜,流水線更長。上面四種動畫的分類,按渲染流水線的復(fù)雜程度和理論性能排列(復(fù)雜程度由低到高,理論性能由高到低):

  • 合成器本身觸發(fā)并運(yùn)行的動畫;
  • Blink 觸發(fā),合成器運(yùn)行的動畫;
  • Blink 觸發(fā),無法由合成器運(yùn)行的動畫;
  • 由 Timer/RAF 驅(qū)動的 JS 動畫;
  • 長久以來,瀏覽器渲染流水線的設(shè)計(jì)都主要是為了合成器動畫的性能而優(yōu)化,甚至在某種程度上導(dǎo)致非合成器動畫性能的下降,比如說合成器的異步光柵化機(jī)制。不過這兩年,隨著對 WebApp 渲染性能包括 WebGL 性能的重視,并且隨著主流移動設(shè)備的硬件性能持續(xù)提升,合成器動畫的性能也已經(jīng)基本不成問題,Chrome 的渲染流水線已經(jīng)更多地針對非合成器動畫的性能進(jìn)行優(yōu)化,甚至?xí)?dǎo)致在某些特定狀況下合成器動畫性能的下降,比方說傾向于為了維持圖層樹的穩(wěn)定性,減少變更,而生成更多的圖層。不過總的說來,目前 Chrome 的渲染流水線,在主流的移動設(shè)備上,大部分場景下,兩者性能都能獲得一個(gè)較好的平衡。

    3. 動畫性能分析基礎(chǔ)

    這里的性能分析主要是針對移動設(shè)備,以桌面處理器的性能,大部分場景下都不存在性能問題。目前移動設(shè)備的屏幕刷新率基本上都是 60hz,而瀏覽器跟其它應(yīng)用一樣,需要跟屏幕刷新保持垂直同步,也就是動畫幀率的上限是 60 幀,這也是我們能夠達(dá)到的最理想的結(jié)果。不過考慮瀏覽器本身的復(fù)雜程度,可能有很多后臺任務(wù)在運(yùn)行,而且操作系統(tǒng)本身也可能同時(shí)運(yùn)行其它后臺任務(wù),并且移動平臺要考慮能耗和散熱,CPU/GPU 的調(diào)度策略會頻繁地發(fā)生變化,要完全鎖定 60 幀是非常困難的。

    如果上限超過 60 幀,實(shí)際平均幀率超過 60 反而不難,但是如果上限是 60 幀,垂直同步下要鎖定 60 幀是非常困難的,要求每一幀的各個(gè)環(huán)節(jié)耗時(shí)都要保持非常穩(wěn)定。

    一般而言:

  • 幀率在 55 ~ 60 之間已經(jīng)可以認(rèn)為是非常優(yōu)秀的水平,這時(shí)用戶幾乎感覺不到卡頓;
  • 幀率在 50 ~ 55 之間可以認(rèn)為是良好的水平,用戶感覺到輕微卡頓,但整體來說還是比較流暢;
  • 要達(dá)到 50 幀以上的水平,我們就需要對動畫在渲染流水線的每個(gè)重要環(huán)節(jié)進(jìn)行性能計(jì)算,需要知道這些環(huán)節(jié)最長允許的耗時(shí)上限和網(wǎng)頁影響這些環(huán)節(jié)耗時(shí)的主要原因,雖然實(shí)際上很難完全鎖定 60 幀,但是一般來說性能分析/優(yōu)化還是會以 60 幀為目標(biāo)來倒推各個(gè)環(huán)節(jié)的最大耗時(shí)。

    如果是場景比較復(fù)雜的 Canvas/WebGL 游戲,以 30 幀為目標(biāo)幀率是一個(gè)合理的訴求。

    3.1 光柵化機(jī)制

    在對動畫性能進(jìn)行分析之前,需要先說明一下目前的 Chrome 的光柵化機(jī)制。合成器會監(jiān)控是否需要安排新的光柵化任務(wù),當(dāng)需要光柵化調(diào)度時(shí):

  • 合成器找到所有在當(dāng)前可見區(qū)域的圖層;
  • 合成器找到這些圖層在當(dāng)前可見區(qū)域的分塊;
  • 合成器檢查這些分塊是否需要光柵化,如果需要,生成一個(gè)對應(yīng)的光柵化任務(wù)并分配所需要的 Resource 放入任務(wù)隊(duì)列里面;
  • Renderer 進(jìn)程會預(yù)先創(chuàng)建一個(gè)或者多個(gè) Worker 線程(移動平臺一般是兩個(gè)),這些線程會從任務(wù)隊(duì)列里面順序取出每一個(gè)光柵化任務(wù)并運(yùn)行;
  • 光柵化任務(wù)運(yùn)行后,會通知合成器,合成器根據(jù)需要檢查哪些任務(wù)已經(jīng)完成,已經(jīng)完成的任務(wù), Resource 會轉(zhuǎn)交給對應(yīng)的分塊;
  • 實(shí)際的光柵化區(qū)域會比當(dāng)前可見區(qū)域要更大一些,一般是增加一個(gè)分塊大小單位,對不可見區(qū)域的預(yù)光柵化有助于提升合成器動畫的性能和減少出現(xiàn)空白的幾率。

    從上可知,合成器的光柵化調(diào)度完全是異步的,合成器在 Compositor 線程需要執(zhí)行的就是安排光柵化任務(wù)和檢查哪些任務(wù)已經(jīng)完成,Compositor 線程本身不會被真正運(yùn)行光柵化任務(wù)的 Worker 線程所阻塞。

    4 合成器動畫性能分析和優(yōu)化指南

    4.1 動畫流水線

    上圖顯示了合成器動畫的渲染流水線示意圖,根據(jù) Android WebView 平臺的實(shí)現(xiàn)進(jìn)行繪制,其它平臺可能略微不同,但對后面的性能分析,在大部分情況下影響不大

    整個(gè)流水線的大概過程是:

  • 位于 Browser 進(jìn)程 UI 線程的窗口管理器接收到來自操作系統(tǒng)的屏幕刷新垂直同步信號(VSync),開始準(zhǔn)備輸出新的一幀,它首先給位于 Renderer 進(jìn)程 Compositor 線程的 Layer Compositor 發(fā)送一個(gè) Begin Frame 消息;
  • Layer Compositor 接收到 Begin Frame 消息后,更新合成器內(nèi)部的狀態(tài)機(jī),開始準(zhǔn)備輸出 Compositor Frame,在這個(gè)過程中的一個(gè)重要動作就是 Animate,合成器會檢查當(dāng)前是否有正在運(yùn)行的動畫,然后運(yùn)行這些動畫,并根據(jù)動畫運(yùn)行的結(jié)果改變關(guān)聯(lián)圖層的對應(yīng)屬性(比如慣性滾動動畫改變圖層的 Scroll Offset,Transform 動畫改變圖層的 Transform),Animate 的結(jié)果會發(fā)送回給 UI 線程告訴其是否有動畫正在運(yùn)行,需要更新窗口;
  • 如果 UI 線程確定合成器需要更新窗口,則會發(fā)送一個(gè) Draw 消息請求合成器輸出下一幀 Compositor Frame;
  • 合成器按下面的過程產(chǎn)生新的 Compositor Frame 并發(fā)送給 Display Compositor;
    4.1 合成器找出在當(dāng)前可見區(qū)域內(nèi)顯示的圖層;
    4.2 合成器找出這些圖層在可見區(qū)域內(nèi)的分塊;
    4.3 如果該分塊已經(jīng)有分配 Resource(說明此分塊已經(jīng)完成光柵化),則產(chǎn)生一個(gè) Draw Quad 的命令置入 Compositor Frame 中,如果沒有則跳過;
  • Display Compositor 接受到新的 Compositor Frame 后,對 Compositor Frame 進(jìn)行 Render,將每一個(gè) Draw Quad 命令轉(zhuǎn)換成一個(gè) GL Draw Call,然后 GPU 執(zhí)行所有的 GL 指令完成最后的窗口繪制;
  • 上述流程的一些關(guān)鍵點(diǎn)是:

  • Draw 的過程中,合成器不會等待可見的分塊光柵化完成,這讓合成器充分利用了異步光柵化的機(jī)制來提升性能,但是也會造成動畫過程中可能會出現(xiàn)空白的分塊,比如快速滾動頁面有時(shí)會看到空白區(qū)域;
  • 在合成器動畫過程中,Layer Compositor 和 Display Compositor 是異步并發(fā)的,在 Display Compositor 輸出 GL Frame N 的時(shí)候,Layer Compositor 已經(jīng)可以開始輸出下一幀 Compositor Frame N + 1,這意味只要讓 Compositor Frame N 和 GL Frame N 的耗時(shí)各自都在 16.7 毫秒以內(nèi)就可以實(shí)現(xiàn) 60 幀的動畫;
  • 4.2 動畫耗時(shí)分析

  • Begin Frame 的耗時(shí)一般很短,大概 1 ~ 2 毫秒左右;
  • Draw 的耗時(shí)也不長,一般在 3 ~ 5 毫秒左右,耗時(shí)主要取決于網(wǎng)頁的圖層復(fù)雜度,總的來說合成器動畫過程中 Compositor 線程的開銷一般都不會構(gòu)成性能瓶頸;
  • Render 的耗時(shí)也不長,同樣在 3 ~ 5 毫秒左右,耗時(shí)主要取決于當(dāng)前可見區(qū)域內(nèi)的可見分塊的數(shù)量;
  • GPU 部分的耗時(shí)比較長,耗時(shí)主要取決于當(dāng)前可見區(qū)域內(nèi)的可見分塊的總面積,也就是繪制的總面積,一旦 Render + GPU 部分的耗時(shí)大于 16.7 毫秒,動畫就會出現(xiàn)掉幀;
  • 總的來說影響合成器動畫性能的最關(guān)鍵因素就是過度繪制系數(shù)(Overdraw,可以理解為繪制的面積和可見區(qū)域面積的比例),如果網(wǎng)頁本身存在大量圖層堆疊情況,導(dǎo)致過度繪制系數(shù)過高,就會嚴(yán)重影響合成器動畫的性能。經(jīng)驗(yàn)顯示,過度繪制系數(shù)比較理想的值是在 2 以內(nèi),一般建議不超過 3,這樣可以保證在中低端的移動設(shè)備上也有不錯(cuò)的性能表現(xiàn)。

    另外,合成器動畫過程中,Compositor 和 GPU 線程是前臺線程,它們雖然理論上不會被 Worker 和 Renderer 線程阻塞,但是在真實(shí)的運(yùn)行場景中,移動設(shè)備的 CPU/GPU 和內(nèi)存帶寬等硬件資源是有限的,如果 Worker 和 Renderer 線程處于高負(fù)荷狀態(tài)下,也會導(dǎo)致前臺的 Compositor 和 GPU 線程阻塞,最終導(dǎo)致合成器動畫掉幀。

    這種現(xiàn)象常見于:

  • 網(wǎng)頁在合成器動畫比如慣性滾動過程中,有大量的 JS 加載圖片或者其它內(nèi)容,并頻繁地對 DOM 樹進(jìn)行操作;
  • 網(wǎng)頁的圖層樹非常復(fù)雜,并且其結(jié)構(gòu)在合成器動畫過程中頻繁發(fā)生變化,導(dǎo)致大量的光柵化任務(wù)在 Worker 線程運(yùn)行;
  • 4.3 動畫性能優(yōu)化 Checklist

    根據(jù)上述的耗時(shí)分析,我們可以給出一個(gè)頁端優(yōu)化合成器動畫性能的簡單 Checklist

  • 檢查網(wǎng)頁的圖層結(jié)構(gòu)是否合理,包括深度和數(shù)量,一般來說深度在 10 以內(nèi),數(shù)量在 100 以內(nèi)是比較合理的值;
  • 檢查網(wǎng)頁的合成器動畫,包括網(wǎng)頁的慣性滾動,各種圖層的淡入/淡出等動畫,在動畫過程中,是否同時(shí)存在大量的網(wǎng)絡(luò)加載和 DOM 操作,網(wǎng)頁圖層結(jié)構(gòu)是否保持穩(wěn)定;
  • 當(dāng)網(wǎng)頁處于任一滾動位置上時(shí),它的當(dāng)前過度繪制系數(shù)是否合理;
  • 如何判斷網(wǎng)頁的圖層結(jié)構(gòu)是否穩(wěn)定,一般而言,如果是位于葉子節(jié)點(diǎn)的圖層增加或者移除,對整個(gè)圖層結(jié)構(gòu)影響并不大,但是如果是中間節(jié)點(diǎn)的圖層增加或者移除,對圖層結(jié)構(gòu)的影響就比較大了,并且越是接近根節(jié)點(diǎn),影響就越大。

    現(xiàn)在的頁端都會大量使用異步加載來優(yōu)化加載性能和流量,但是容易出現(xiàn)導(dǎo)致動畫掉幀的現(xiàn)象。要平衡好這一點(diǎn)意味著需要實(shí)現(xiàn)一個(gè)加載和關(guān)聯(lián) DOM 操作的調(diào)度器,如果檢查到動畫正在運(yùn)行,則停止加載或者通過節(jié)流閥機(jī)制降低加載的并發(fā)數(shù)量和頻率,同時(shí)可以通過事先生成相應(yīng)的 DOM 節(jié)點(diǎn)和圖層作為占位符來避免加載后的圖層結(jié)構(gòu)發(fā)生劇烈變化。

    5 非合成器動畫性能分析和優(yōu)化指南

    前面已經(jīng)我們已經(jīng)把非合成器動畫區(qū)分為 Blink 觸發(fā),無法由合成器運(yùn)行的動畫和由 Timer/RAF 驅(qū)動的 JS 動畫兩類,因?yàn)榍罢呖梢哉J(rèn)為是后者的一個(gè)簡化版本,所以這一章主要討論 Timer/RAF 驅(qū)動的 JS 動畫。

    5.1 動畫流水線

    從上圖可以看出非合成器動畫的流水線比合成器動畫更長更復(fù)雜,并且非合成器動畫的后半段跟合成器動畫是一致的。

  • JavaScipt 部分是頁端實(shí)現(xiàn)的邏輯,可能包含了計(jì)算的部分,和調(diào)用瀏覽器提供的 API 的部分(修改 DOM 樹,CSS 屬性等),最終改變了網(wǎng)頁的內(nèi)容;
  • 網(wǎng)頁內(nèi)容被改變會導(dǎo)致 Blink 生成新的 MainFrame,MainFrame 包括了重排版,更新圖層樹,和重新記錄發(fā)生變更的圖層的內(nèi)容,生成新的 DisplayList,等等;
  • Blink 生成新的 MainFrame 后需要向合成器發(fā)起 Commit 的請求,合成器在 Commit 過程中根據(jù) MainFrame 生成自身的圖層樹,Blink 在 Commit 的過程中保持阻塞狀態(tài),Commit 完成后再繼續(xù)運(yùn)行;
  • 合成器實(shí)際上有兩棵圖層樹,新提交的 MainFrame 生成的是 Pending 樹,用于繪制 Draw 的是 Active 樹,只有當(dāng) Pending 樹當(dāng)前可見區(qū)域部分的分塊全部完成 Rasterize 后,才會進(jìn)入 Active 步驟,在 Active 的過程中,Pending 樹相對于 Active 樹的變更部分才會被同步到 Active 樹;
  • Active 后,合成器會向 UI 線程的窗口管理器發(fā)起重繪請求,窗口管理器會在下一個(gè) VSync 的時(shí)候開始繪制新的一幀,后面的流程就跟合成器動畫是一樣的了;
  • 上述流程的一些關(guān)鍵點(diǎn)是:

  • 在合成器動畫中,分塊沒有完成光柵化,出現(xiàn)空白是被允許的,這樣瀏覽器可以更好地保證合成器動畫的幀率,但是在非合成器動畫中出現(xiàn)空白是不被允許的,因?yàn)樾碌?MainFrame 常常會帶來大面積的變更,如果允許空白的話可能會出現(xiàn)非常不好的視覺效果。這樣就導(dǎo)致合成器需要使用兩棵圖層樹來構(gòu)建一個(gè)類似雙緩沖的機(jī)制,只有當(dāng) Pending 樹在后臺完成可見區(qū)域的光柵化時(shí)才被允許同步到 Active 樹;
  • 在非合成器動畫過程中,Main Frame N,Main Frame N Active;Compositor Frame N,GL Frame N 這四個(gè) Block 基本上可以認(rèn)為是可以并發(fā)運(yùn)行的(唯一會阻塞的環(huán)節(jié)是 Commit,不過 Commit 耗時(shí)一般不長),理論上我們要實(shí)現(xiàn) 60 幀的非合成器動畫,只需要保證其中每個(gè) Block 的耗時(shí)總和小于 16.7 毫秒即可。當(dāng)然實(shí)際的狀況下,在移動設(shè)備上很難實(shí)現(xiàn)這么多線程完全并發(fā)運(yùn)行,加上過多線程帶來的互相通訊的開銷,使得每個(gè) Block 的最大允許耗時(shí)實(shí)際上是小于 16.7 毫秒的;
  • 5.2 動畫耗時(shí)分析和優(yōu)化指南

  • JavaScipt 的耗時(shí)是由頁端自己的邏輯決定的,一般超過 10 毫秒就基本上很難實(shí)現(xiàn) 60 幀的非合成器動畫了;
  • MainFrame 的耗時(shí)主要取決于網(wǎng)頁 DOM 樹,圖層樹的復(fù)雜程度和變化程度,在變更很小,比如只有幾個(gè)元素的內(nèi)容發(fā)生變化,圖層樹不變的情況下,一般耗時(shí)都是在 3 ~ 5 毫秒左右,如果變更很大,幾十甚至幾百都是有可能的;
  • Commit 的耗時(shí)主要取決于圖層樹的復(fù)雜程度,一般耗時(shí)都很短,大概 2 ~ 3 毫秒上下;
  • Rasterize 的耗時(shí)范圍變化極大,取決于網(wǎng)頁內(nèi)容的復(fù)雜程度和新 MainFrame 在當(dāng)前可見區(qū)域內(nèi)網(wǎng)頁內(nèi)容發(fā)生變化的總面積,另外圖片解碼也發(fā)生在這個(gè)階段,而圖片解碼也是光柵化耗時(shí)最多的一個(gè)環(huán)節(jié),光柵化的耗時(shí)從幾毫秒到幾百毫秒都有可能(圖片在第一次被光柵化時(shí)被解碼,一直在可見區(qū)域內(nèi)的圖片不會被反復(fù)重解碼);
  • Active 跟 Commit 的耗時(shí)類似,主要取決于圖層樹的復(fù)雜程度,一般耗時(shí)很短,大概 2 ~ 3 毫秒上下;
  • 總的來說對非合成器動畫性能影響最大的通常是 JavaScript 和 Rasterize,要實(shí)現(xiàn)高性能的非合成器動畫,頁端需要很小心地控制 JavaScript 部分的耗時(shí),并避免在每一幀中引入大面積的網(wǎng)頁內(nèi)容變化和大幅度的圖層結(jié)構(gòu)變化。另外非合成器動畫的后半段就是合成器動畫,所以對合成器動畫的性能優(yōu)化要求也同樣適用于非合成器動畫。

    另外對于 WebGL 來說,當(dāng)在 JavaScript 里面調(diào)用 WebGL API 時(shí),這些命令只是被 Chrome 緩存起來,并不會在 Renderer 線程調(diào)用真正的 GL API,所以 WebGL API 在 JavaScript 部分的耗時(shí)只是一個(gè) JS Binding 調(diào)用的 Overhead,最終繪制 WebGL 內(nèi)容的 GPU 耗時(shí)實(shí)際上是被包含在最后的 GPU 的步驟里面。但是在移動平臺上一個(gè) JS Binding 調(diào)用的 Overhead 是相當(dāng)高的,大概在 0.01 毫秒這個(gè)范圍,所以每一幀超過 1000 個(gè) WebGL API 調(diào)用的 WebGL 游戲,性能阻塞的瓶頸有很大概率會出現(xiàn)在 JavaScript 也就是 CPU 上,而不是 GPU。

    6 瀏覽器渲染流水線未來的演化

    看完非合成器動畫流水線分析的讀者,第一感覺恐怕是覺得太過復(fù)雜了,比起合成器動畫,更多的線程,更多的中間環(huán)節(jié),有時(shí)即使每個(gè)環(huán)節(jié)都做到了完美,最終也有可能因?yàn)榫€程之間的通訊和等待而導(dǎo)致掉幀。正如前面所說的一樣,長久以來,瀏覽器的渲染流水線都是為了合成器動畫而優(yōu)化的,它的主要特征是:

  • 利用圖層緩存作為中間媒介,將光柵化和合成分離,讓光柵化完全獨(dú)立;
  • 異步光柵化的機(jī)制,避免合成器的阻塞;
  • 這兩點(diǎn)實(shí)際上是有利于合成器動畫而不利于非合成器動畫的,瀏覽器渲染流水線當(dāng)前和未來的演化理所應(yīng)當(dāng)?shù)匾鉀Q這些問題。Firefox 新的渲染引擎 WebRender 比較激進(jìn),看起來是采用流行的 UI Toolkit 如 Qt,Android 的 DisplayList/Scene Graph + Direct Rasterize 的方式,這樣當(dāng)然是有利于非合成器動畫的,但是否會造成合成器動畫的性能衰退還很難說。

    Direct Rasterize 的前提條件是瀏覽器渲染引擎要實(shí)現(xiàn) GPU 光柵化,并且性能和兼容性要足夠好。Chrome 當(dāng)前也是在努力推進(jìn) GPU 光柵化,即使整個(gè)流水線的架構(gòu)沒有發(fā)生變化,GPU 光柵化也可以大幅度減少光柵化在 Worker 線程部分的 CPU 耗時(shí),將這些耗時(shí)轉(zhuǎn)移到 GPU 線程上去,這樣 Main Frame N Active 這部分的耗時(shí)就可以大大減少了。從目前的統(tǒng)計(jì)數(shù)據(jù)來看,可以使用 GPU 光柵化的移動設(shè)備占比已經(jīng)很高,大概 6 成以上的樣子,隨著老舊設(shè)備的淘汰,這個(gè)比例未來會越來越高,并且隨著 GPU 性能的提升,GPU 光柵化的效果也會越來越好。

    Chrome 另外一個(gè)重點(diǎn)改進(jìn)渲染性能的項(xiàng)目是 Slim Painting,未來 Blink 跟 Firefox 類似只輸出 DisplayList 樹,并且每棵 DisplayList 不再是以圖層為單位而是以排版對象為單位,這樣合成器可以更自由地選擇 Layerize 和 Rasterize 的策略,Async 或者 On Demand 或者 Direct Rasterize 都可以混用來最大化動畫的性能,合成器可以變得更 Adaptive 而不像現(xiàn)在光柵化和合成區(qū)隔的那么涇渭分明。

    除了瀏覽器持續(xù)改進(jìn)自身渲染流水線外,提供更多 API 供頁端使用來最大化 WebApp 的性能也是一個(gè)重要的方向,包括:

  • 合成器實(shí)現(xiàn)更多的動畫效果,然后通過 API 供頁端直接使用,這樣頁端可以避免自己使用 JavaScript 實(shí)現(xiàn),比如 CSS Snap Point;
  • 更多的有助于幫助頁端將耗時(shí)的 JavaScript 部分從 Renderer 線程遷移到其它 Worker 線程,讓 WebApp 可以更充分地利用硬件的多核能力,通過并發(fā)來提升性能,比如 Offscreen Canvas;
  • 但是這些新特性要真正應(yīng)用起來,對頁端對瀏覽器渲染流水線的理解要求就更高了。

    總結(jié)

    以上是生活随笔為你收集整理的浏览器渲染流水线解析与网页动画性能优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    欧美激情精品久久久久久变态 | 欧美另类调教 | 最近中文字幕国语免费高清6 | 就要色综合 | 中文字幕在线免费97 | 国产色啪 | 丁香五月缴情综合网 | 日韩高清一 | 国产高清视频色在线www | 久久视频精品 | 欧美a级免费视频 | 久久国产电影院 | 亚洲a成人v | 69国产在线观看 | 国产区在线看 | 色激情五月 | 日韩精品五月天 | 99精品免费视频 | 黄网站免费看 | 播五月婷婷 | 久久伦理电影网 | 午夜精品久久久久久久99 | 国产黄色av网站 | 久草视频免费在线观看 | av一级片网站 | 成人免费观看视频大全 | 欧美日韩精品免费观看视频 | 久一在线| 911精品美国片911久久久 | 91尤物国产尤物福利在线播放 | 九九视频在线观看视频6 | 99热在线精品观看 | 国内精品久久久久影院男同志 | 精品欧美一区二区精品久久 | 四虎影视4hu4虎成人 | 亚洲日本va午夜在线影院 | 亚州精品在线视频 | 久久免费99精品久久久久久 | 国产一级免费片 | 亚洲欧洲av在线 | 人人添人人澡人人澡人人人爽 | 免费男女羞羞的视频网站中文字幕 | 黄色日批网站 | 男女精品久久 | 国产第一福利网 | 欧美精品少妇xxxxx喷水 | 2024国产精品视频 | 91免费观看网站 | 另类老妇性bbwbbw高清 | www.久久色 | 视频国产| 国产91亚洲 | 久久国产亚洲 | 三级av小说 | 人人插人人干 | 麻豆国产在线播放 | 日韩特级黄色片 | 成人午夜电影在线观看 | 色多视频在线观看 | 中文字幕在线视频国产 | av中文字幕在线免费观看 | 亚洲一区网 | 91手机电影| 97视频总站 | 国产91学生粉嫩喷水 | 日韩在线视频免费观看 | 一级黄色片毛片 | 国产视频一二区 | 欧美日韩三级在线观看 | 青青五月天 | 在线免费观看av网站 | 亚洲精品国产电影 | 色综合久久综合中文综合网 | 超碰97人人射妻 | 欧美激情va永久在线播放 | 国产伦精品一区二区三区无广告 | 97人人模人人爽人人少妇 | 911国产在线观看 | 国产国语在线 | 国色天香永久免费 | 久久av福利 | 一区二区三区高清在线 | 欧美在线日韩在线 | 免费在线观看av的网站 | 国产91在线 | 美洲 | 黄色天堂在线观看 | 欧美一区二区免费在线观看 | 在线看片成人 | 日批网站免费观看 | 色视频在线观看 | 亚洲精品无 | 天天爽人人爽夜夜爽 | 午夜电影中文字幕 | av中文字幕av| 狠狠搞,com| 亚洲一级二级 | 日韩v欧美v日本v亚洲v国产v | 丁香五月亚洲综合在线 | 在线观看免费黄色 | 欧美视频二区 | 国产中文字幕久久 | 麻豆成人精品 | 午夜久久影视 | 成人午夜久久 | 午夜国产在线观看 | 色综合久久综合中文综合网 | 最新日韩电影 | 成人免费 在线播放 | 国内精品久久久久久久影视简单 | 色综合久久88色综合天天 | 日日操天天爽 | 国产一区二区久久久久 | 超碰97网站| 在线免费av观看 | 久草a在线 | 看国产黄色片 | 久久69精品| 五月婷婷天堂 | 久久综合一本 | www.eeuss影院av撸| 最近日本字幕mv免费观看在线 | 亚洲精品456在线播放乱码 | 国产精品第52页 | 五月天六月丁香 | 欧美日韩国产伦理 | 91高清完整版在线观看 | 狠狠色香婷婷久久亚洲精品 | 久久人人爽av | 激情 一区二区 | 亚洲精品中文在线 | 美女视频又黄又免费 | 国产小视频在线 | 久久精品在线免费观看 | 69国产盗摄一区二区三区五区 | www.色婷婷 | 色婷婷视频在线 | 国产 色| 国产精品久久久久一区 | 成人国产一区二区 | 国产精品一区二区久久久久 | 久久极品| 国产精品手机在线观看 | 欧美久久久影院 | 97国产精品视频 | 精品成人国产 | 99久久精品国产欧美主题曲 | 久久伊人色综合 | 制服丝袜在线 | av在线播放观看 | 日韩精品极品视频 | 亚洲专区在线视频 | 国产精品门事件 | 日韩伦理片一区二区三区 | 中文字幕在线有码 | 黄色三级视频片 | 久久视屏网 | 日韩一区精品 | 涩涩在线 | 日韩在线播放av | a级一a一级在线观看 | 91热| 精品毛片久久久久久 | 亚洲成人av片在线观看 | 日韩国产欧美在线视频 | 伊人官网 | 国语对白少妇爽91 | 91成人蝌蚪| 国产成人精品国内自产拍免费看 | 国产一区二区三区午夜 | 在线午夜电影神马影院 | bbbbb女女女女女bbbbb国产 | 欧美精品在线观看一区 | 中文字幕黄色网 | 国产精品自产拍在线观看 | 日韩r级电影在线观看 | 国产成人亚洲在线观看 | 国产精品久久久久久爽爽爽 | 不卡视频在线看 | 在线视频精品 | 欧美最猛性xxxxx亚洲精品 | 午夜久久久久久久久 | 免费亚洲婷婷 | 欧美综合在线视频 | 免费网站观看www在线观看 | 亚洲一区网站 | 日韩av网页| 国产精品k频道 | 日韩精品2区 | 国产精品久久久久久久久毛片 | 91丨九色丨蝌蚪丨对白 | 97超碰在线久草超碰在线观看 | 色噜噜在线观看视频 | 在线免费黄色av | 成人国产精品久久久 | 四虎影视成人精品国库在线观看 | 美女又爽又黄 | 天天操福利视频 | 美女国产网站 | 九色琪琪久久综合网天天 | www国产亚洲精品久久网站 | 一区二区三区手机在线观看 | 全久久久久久久久久久电影 | 国产亚洲人成网站在线观看 | 丁香婷婷成人 | 成人免费在线观看电影 | 免费看av片网站 | 天天操 夜夜操 | 久久久免费电影 | 日韩中文字幕国产 | 国产理论在线 | 国产精品视频大全 | 国产视频18 | 国产成人免费观看久久久 | 免费看污污视频的网站 | 91av视频免费在线观看 | 99国产在线观看 | 超碰97中文 | 久久国内精品 | 国产精品久久久777 成人手机在线视频 | 亚洲一区免费在线 | 免费看十八岁美女 | 欧美日韩p片 | 国产精品美女免费视频 | 日韩av快播电影网 | 91在线播放国产 | 日韩爱爱网站 | 中文字幕乱码视频 | 久久精品草 | 成人av网址大全 | 就要干b| 欧美 日韩 国产 成人 在线 | 国产资源免费在线观看 | 免费看国产a | 国产一区二区三区黄 | 黄色一及电影 | 天天色成人 | 久久婷婷一区 | 国产视频一区二区在线 | 午夜精品视频一区二区三区在线看 | 欧美精品999 | 韩国视频一区二区三区 | www.亚洲精品视频 | 天天干天天拍天天操 | 成年人在线免费看视频 | 8x成人在线 | 国产精品视频免费观看 | 国产精品久久久久久超碰 | 日韩av手机在线观看 | 日韩视频专区 | 视频一区在线免费观看 | 天天色婷婷 | 国产色视频网站2 | 国产一区精品在线观看 | 久99久精品视频免费观看 | 五月激情六月丁香 | 最新超碰在线 | 嫩草av在线 | 激情中文在线 | 91毛片在线观看 | 亚洲va欧美va人人爽 | 国产一区视频在线 | 青青河边草免费观看 | 丰满少妇对白在线偷拍 | 99国产精品久久久久久久久久 | 香蕉色综合| 四虎视频 | www日韩| www久| 欧美先锋影音 | 毛片激情永久免费 | 亚洲永久精品在线 | 免费观看国产精品 | 国产午夜精品一区二区三区嫩草 | 日本久久久精品视频 | 人人爱在线视频 | 二区在线播放 | 欧美一级大片在线观看 | 国产特级毛片aaaaaa高清 | 精品久久美女 | 9999激情 | 97超碰影视| 又黄又刺激的视频 | 久久99精品久久久久久秒播蜜臀 | 少妇bbw搡bbbb搡bbbb | 中文字幕视频网站 | 久久久久在线 | 日韩成人中文字幕 | 一区二区理论片 | 日韩精品视频久久 | a√资源在线 | 亚洲视频,欧洲视频 | 久草在线免费资源 | 九九色综合 | 91黄色在线看 | 国产精品自产拍在线观看中文 | 国产在线色 | 狠狠成人 | 亚洲视频在线视频 | 国产色 在线 | 在线导航av | 91中文在线观看 | 日韩精品亚洲专区在线观看 | 狠狠操电影网 | 亚洲视频在线免费看 | 黄色网址中文字幕 | 中文字幕 影院 | 天天爱天天舔 | 深爱激情五月婷婷 | 免费在线观看午夜视频 | 在线视频1卡二卡三卡 | 精品一区二区在线免费观看 | 久久不卡视频 | 99精品一级欧美片免费播放 | 精品视频久久久久久 | 天天爽天天搞 | 亚洲欧美国产日韩在线观看 | 久久免费公开视频 | 久久av伊人 | 色婷婷久久一区二区 | 97超碰在线久草超碰在线观看 | 日韩高清 一区 | 国产精品久久久久999 | 五月婷亚洲| 人人插人人舔 | 亚洲理论在线观看 | 人人爱人人射 | 国产精品自产拍 | 日日夜夜草| 亚洲激情一区二区三区 | 色婷婷电影网 | 中文字幕之中文字幕 | 中文字幕成人在线 | 免费福利片2019潦草影视午夜 | 国产 欧美 在线 | 久久久久久久久久久久国产精品 | 久久久精品日本 | aaa毛片视频 | 插久久 | 久热久草 | 久草在线视频精品 | 久久草草热国产精品直播 | 在线观看一级 | 91精品综合在线观看 | 91国内在线 | 在线日韩视频 | 国产亚洲在线视频 | 免费网站观看www在线观看 | 久久久久在线视频 | 久久久久电影网站 | 国产精品一区二区三区电影 | 香蕉久草 | 成人av片在线观看 | 亚洲精品国产电影 | 999国内精品永久免费视频 | 激情综合网五月婷婷 | 国产日本在线观看 | 麻豆av一区二区三区在线观看 | 欧美色伊人 | 伊人成人激情 | 国产护士hd高朝护士1 | 国产午夜三级一区二区三 | 久久99国产精品久久99 | 午夜国产一区二区三区四区 | 天天艹天天干天天 | 特级黄色片免费看 | 欧美日韩视频在线观看一区二区 | 国产精品久久久久久久午夜片 | 国产精品一区二区三区视频免费 | 久草视频免费播放 | 国产精品国内免费一区二区三区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 中文字幕在线视频一区二区三区 | 超碰97.com| 精品国产乱码久久久久 | 国产高清免费在线观看 | 午夜av电影| 亚洲.www| 人人插人人玩 | 久草视频资源 | 欧美精品久久久久久 | 九九九九免费视频 | 色香网| 欧美一区二区三区在线看 | 久久国产成人午夜av影院潦草 | 狠狠色综合网站久久久久久久 | 久久香蕉国产精品麻豆粉嫩av | www.夜色.com | 看片黄网站 | 国产精品免费看久久久8精臀av | 久久久2o19精品 | 国产成本人视频在线观看 | 在线免费性生活片 | 久久在线精品 | 成人一级免费视频 | 亚洲国内精品 | 精品一区二区三区久久 | 日韩videos高潮hd | 国产精品久久久久久久久大全 | av在线播放免费 | 久久精品8| 操少妇视频 | 五月综合色 | 天天操天天色综合 | 91黄色在线观看 | 天天干夜夜擦 | 国产精品久久久99 | 成年免费在线视频 | 日韩av在线高清 | 国产精品资源网 | 国产在线观看地址 | 国产精品福利无圣光在线一区 | 综合天天网 | 国产精品成人久久久久 | 天天色中文 | 欧美一区在线看 | 欧美性受极品xxxx喷水 | 四虎5151久久欧美毛片 | 婷婷性综合| 成人av资源网 | 久久午夜精品 | 免费成人黄色av | av在线h | 国产97在线播放 | 西西444www大胆无视频 | 中字幕视频在线永久在线观看免费 | 最近日本韩国中文字幕 | 婷婷夜夜| 麻豆国产露脸在线观看 | 亚洲国产成人在线观看 | 99久久精品免费看国产免费软件 | 久久久久亚洲国产 | 69久久久久久久 | 国内精品久久久久久久影视简单 | 91在线看片 | 精品美女久久久久久免费 | 夜夜爽88888免费视频4848 | 91九色成人蝌蚪首页 | 亚洲精品久久久久久中文传媒 | 超级碰碰碰免费视频 | 中国一级特黄毛片大片久久 | 五月天电影免费在线观看一区 | 日韩精品中文字幕在线观看 | 久久,天天综合 | 亚洲爱av | 一区在线播放 | 亚洲午夜久久久综合37日本 | 九九久久影视 | 丰满少妇在线 | 黄色网址av | 日韩av偷拍 | 久久久久国产精品午夜一区 | 四虎影视精品 | 亚洲精品久久久久久国 | 97av色| 日韩av在线免费看 | 久草在线免费资源 | 一级成人免费视频 | 亚洲成a人片在线www | 视频一区在线播放 | 亚洲国产视频直播 | 国产视频日韩视频欧美视频 | 色婷在线 | 黄色影院在线免费观看 | 九九热免费在线视频 | 国产日韩精品久久 | www.狠狠操.com | 欧美少妇bbwhd | 91在线免费观看网站 | 久久久国产一区二区三区 | 亚洲精品理论 | 五月天开心 | 日产av在线播放 | 亚洲少妇自拍 | 成人午夜黄色影院 | 国产精品综合久久久 | 日韩二区在线 | 蜜桃av人人夜夜澡人人爽 | 黄网站免费大全入口 | 91av视频网 | www色综合 | 91精品国自产在线 | 国产精品国产亚洲精品看不卡 | av在线播放一区二区三区 | 中文字幕色在线视频 | 国产xvideos免费视频播放 | 国产在线观看你懂得 | 欧美日韩一区二区三区在线免费观看 | 亚洲一区黄色 | 日韩网站一区二区 | 中文字幕高清在线 | 久久无码精品一区二区三区 | 免费在线观看的av网站 | 男女激情免费网站 | 一区二区影视 | 久久精品99国产精品亚洲最刺激 | 色偷偷88888欧美精品久久久 | 日韩欧美在线观看一区二区三区 | 欧美日韩在线观看一区 | 最新黄色av网址 | 99精品视频免费观看 | 2023av| 99re6热在线精品视频 | 欧美少妇影院 | 国产资源精品 | 日韩在线视频观看 | 成人av免费在线观看 | 成人午夜影视 | 国产精品人人做人人爽人人添 | 欧美韩国在线 | 国产成人福利在线观看 | www.天天干 | 欧美一区二区三区在线视频观看 | 日韩高清成人在线 | 久久国产香蕉视频 | 黄网站色欧美视频 | 国产精品无av码在线观看 | 成年人免费看的视频 | 黄色免费大全 | 免费av 在线 | 成人性生爱a∨ | 久久久www成人免费精品张筱雨 | 日韩视频一区二区 | 日韩免费一级a毛片在线播放一级 | av短片在线观看 | ,午夜性刺激免费看视频 | 一区二区三区国 | 久久亚洲人 | 日韩欧美视频在线 | 婷婷六月色 | 手机av资源 | 日韩黄色免费在线观看 | 国产精品一区二区在线免费观看 | 亚洲欧美日韩精品一区二区 | 久久国语 | 97超级碰 | 成人久久久电影 | 蜜臀久久99精品久久久无需会员 | 国产精品一区二区免费在线观看 | 欧美午夜寂寞影院 | 狠狠干在线| 日日爽天天爽 | 九色琪琪久久综合网天天 | 日韩三级视频在线看 | www.夜夜操.com | 日韩肉感妇bbwbbwbbw | 久久综合色天天久久综合图片 | 依人成人综合网 | 国产精品一区二区三区四区在线观看 | 久久久久免费精品 | 视频91 | 九九热免费精品视频 | 91成年视频| 久久精品牌麻豆国产大山 | 欧美日韩免费看 | 免费网站黄色 | 亚洲精品中文在线资源 | 亚洲美女在线一区 | 国产日韩中文字幕在线 | 欧美成人按摩 | 激情综合网在线观看 | 国产黄色免费观看 | 久久久久久久久久电影 | 国产成人精品一区二区三区网站观看 | 亚洲午夜剧场 | 97成人精品 | 午夜精品久久久久久久久久 | 成人免费网站视频 | 国产一二三区在线观看 | 福利在线看片 | av在线播放不卡 | 欧美日韩高清 | 欧美一区二区在线 | 久草在线免费资源 | 日本99热| 国产伦精品一区二区三区免费 | 一区二区三区 中文字幕 | 亚洲精品一区二区在线观看 | 欧美一二三视频 | 久久久亚洲国产精品麻豆综合天堂 | 午夜精品成人一区二区三区 | 99精品久久精品一区二区 | 五月综合色婷婷 | 中文字幕乱在线伦视频中文字幕乱码在线 | 一区二区影视 | 日韩视频免费在线观看 | 91av欧美 | 国产精品久久久久久久久久久久久久 | 97精品在线观看 | 99色| 亚洲精品视频中文字幕 | 97国产大学生情侣酒店的特点 | 在线影院av| 91成人精品一区在线播放 | 美女网站视频免费黄 | 亚洲精品一区二区网址 | 在线国产中文字幕 | 婷婷深爱 | 欧美日韩免费视频 | 玖玖国产精品视频 | 国产特级毛片aaaaaa | 久久婷婷视频 | 亚洲一级片免费观看 | 中国老女人日b | 日韩久久久久 | 国产在线观看免费观看 | 在线观看av小说 | 91九色视频在线播放 | 国产免费嫩草影院 | 日韩视频1 | 国产精品成人久久久久久久 | 亚洲欧洲成人精品av97 | 亚洲精品免费播放 | av最新资源| 国产99区 | 国产一二区在线观看 | 天天操夜 | 日日躁你夜夜躁你av蜜 | 亚洲高清激情 | 国产精品一区久久久久 | 久久激情综合网 | 9999亚洲 | 天天综合导航 | 免费视频区 | 在线观看免费视频你懂的 | 婷婷六月丁 | 国产福利精品视频 | 午夜精品久久久久久久99无限制 | 99视频在线免费看 | 狠狠网亚洲精品 | 在线观看一区视频 | 在线免费色视频 | 中文字幕在线观看免费 | 美女免费av| 色多多视频在线观看 | 欧美三级在线播放 | 国产精品色在线 | 国产亚洲精品久久久久久大师 | 九九热视频在线免费观看 | 免费午夜在线视频 | 亚洲免费视频在线观看 | 日韩超碰 | 色av网站| 免费看黄20分钟 | 精品91视频 | 亚洲电影av在线 | 天天干天天看 | 在线免费黄网站 | 黄污污网站 | 欧美日韩伦理一区 | 黄网站免费大全入口 | 亚洲福利精品 | 9999在线视频 | 欧美大片大全 | 日韩欧美高清一区二区 | www.亚洲黄色| 国产不卡在线观看视频 | 综合在线观看 | 精品久久久久久久久亚洲 | 久久婷婷五月综合色丁香 | 黄色av成人在线观看 | 日韩欧美xx | 性色av一区二区三区在线观看 | 成人理论电影 | 久久久久免费电影 | 一级黄色片在线观看 | 中文在线√天堂 | 国产精品视频永久免费播放 | 国产黄色片免费观看 | 国产精品二区在线观看 | 亚洲国产日韩欧美在线 | 中文字幕在线看视频国产 | 精品久久电影 | 操高跟美女 | 国产99久久久久 | 成人黄色影片在线 | 色噜噜噜噜| 日韩欧美综合在线视频 | www.夜夜干.com| 在线精品观看 | 欧美一级电影免费观看 | 欧美久久久久久久 | 久久这里只有精品视频99 | 日韩欧美视频在线播放 | 国产精品免费在线 | 热99在线| 国产区精品在线观看 | 99久久电影 | 天天操网站 | 国产精品精品国产 | 成人毛片久久 | 国产又粗又猛又爽又黄的视频免费 | 久久国产精品免费一区二区三区 | 久久精品一二三 | 国产精品区二区三区日本 | 国产精品色婷婷视频 | 中文字幕一区二区在线播放 | 久久国产91 | 欧美日韩在线网站 | 摸bbb搡bbb搡bbbb | av在线网站大全 | 免费韩国av| 国产精品高清在线观看 | 亚洲h在线播放在线观看h | 国产精品九九久久99视频 | 亚州日韩中文字幕 | 日韩欧美视频在线免费观看 | 日韩三级不卡 | 国产福利一区二区在线 | 亚洲欧美国产精品va在线观看 | 人人射人人| 日韩精品欧美专区 | 国产1级视频 | 国产精品久久久久免费观看 | 欧美性极品xxxx做受 | 国产丝袜一区二区三区 | 欧美黑人性爽 | www.777奇米 | 在线亚洲天堂网 | 波多野结衣在线播放视频 | 97超级碰碰 | 国产123区在线观看 国产精品麻豆91 | 亚洲伦理一区 | 在线一区观看 | 国产精品18久久久久久久久久久久 | 国产亚洲精品久久 | 免费中文字幕视频 | 成人动漫视频在线 | av在线影片 | 亚洲日本色 | 一级淫片在线观看 | 色偷偷88欧美精品久久久 | 日本精品久久久久久 | 欧美三级在线播放 | 久久精品一二三区白丝高潮 | 国产中文字幕在线观看 | 九九热精品视频在线播放 | wwwww.国产| 日韩在线中文字幕视频 | 免费视频黄 | 国产精品日韩久久久久 | 夜夜嗨av色一区二区不卡 | 在线国产欧美 | 香蕉视频久久 | 日韩欧美精品一区二区三区经典 | 国产一级黄 | 成人黄色视 | 久久99久久99精品免视看婷婷 | www.成人久久 | 中文字幕在线观看视频一区二区三区 | 91成人精品国产刺激国语对白 | 欧美激情h | 色av男人的天堂免费在线 | 超碰在线天天 | 国产高清专区 | 成年人免费看片网站 | 一本一本久久a久久精品综合妖精 | 亚洲五月 | 成年人免费在线播放 | 三级黄色三级 | 日日操日日操 | 麻豆视频免费入口 | 69人人 | 九九欧美视频 | 少妇av网 | 97精品国产97久久久久久久久久久久 | 午夜在线观看 | 在线视频你懂得 | 精品国产欧美 | 五月天综合在线 | 五月婷婷狠狠 | 97理论电影 | 亚洲午夜精品久久久久久久久 | 国产又黄又硬又爽 | 91av在线视频免费观看 | 丁香婷婷色月天 | 日本久久综合网 | 亚洲一区二区高潮无套美女 | 欧美国产日韩在线观看 | 天天久久综合 | 免费三级黄色片 | www91在线观看 | 天天天色综合a | 日韩在线播放av | 国产色视频网站2 | 久久久亚洲精华液 | 99精品视频免费 | 国产精品99在线播放 | 免费视频在线观看网站 | 国产不卡毛片 | 综合网五月天 | 一区二区三区精品在线视频 | 久久爱导航| 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美性生活小视频 | 六月丁香社区 | 亚洲乱码久久久 | 中文字幕第 | 91精品视频在线 | 国产又黄又爽无遮挡 | 午夜精品久久久久久久爽 | 免费视频网| 亚洲午夜精品福利 | 国产在线中文 | 在线视频日韩一区 | 国产精品免费观看网站 | 激情婷婷色| 久久免费99| 天天干天天天天 | 国产视频亚洲视频 | 最新中文字幕在线资源 | 日韩一区二区免费播放 | 久久不射电影院 | 国产又粗又硬又长又爽的视频 | 69国产精品视频 | 欧洲色吧 | 日韩天堂在线观看 | 精品亚洲视频在线观看 | 日日摸日日爽 | 亚洲成aⅴ人在线观看 | 精品一区二区亚洲 | 91传媒在线看 | 91视频免费看 | 精品女同一区二区三区在线观看 | 日韩欧美一区二区在线播放 | 青青河边草免费观看 | 久久久久久毛片 | 亚洲综合色激情五月 | 91免费日韩| 日韩二区三区 | 国产精品18久久久久久vr | 久久亚洲私人国产精品 | 色综合国产 | 中文字幕在线观看第三页 | 亚洲免费在线播放视频 | 精品视频在线观看 | 欧美高清成人 | 国产成人三级一区二区在线观看一 | 在线视频手机国产 | 精品不卡视频 | 69av国产 | www看片网站 | 8x成人在线 | 国产精品久久久久久久久久了 | 久久伊人热 | 五月开心婷婷 | 在线视频 国产 日韩 | 色婷婷在线视频 | 亚洲男男gaygay无套同网址 | 日韩美女高潮 | 色香蕉在线视频 | 国产色网站 | 精品产品国产在线不卡 | 在线观看av片 | 精品国产亚洲在线 | 麻豆精品视频在线 | 免费网站看v片在线a | 97国产精品久久 | 午夜精品一区二区国产 | 亚洲精品在线观看免费 | 日韩最新中文字幕 | 成人小视频在线观看免费 | 国产日本在线播放 | 亚洲日本精品视频 | 色中文字幕在线观看 | 在线观看中文 | 亚洲综合色丁香婷婷六月图片 | 成年人在线播放视频 | 国产精品久久久久免费 | 婷婷激情五月 | 国产一级片免费观看 | 亚洲一级二级三级 | 亚洲视频免费 | 一本到视频在线观看 | 91精品久久久久久综合乱菊 | 国产精品青青 | 天天干天天操天天干 | 九九视频网站 | 色综合天天在线 | 国产亚洲成人精品 | 夜夜操天天干 | 伊人亚洲综合 | 免费人成网| 91av在| 日韩精品一区二区三区外面 | 最近日本韩国中文字幕 | 毛片基地黄久久久久久天堂 | 亚洲精品乱码久久久久久高潮 | 国产精品久久久久av免费 | 99r在线 | 91喷水 | 久久久精品电影 | av黄色在线播放 | 不卡视频国产 | 91综合久久一区二区 | 丁香色婷 | 日韩av图片 | 天天摸夜夜添 | 久久理伦片 | 国产成人精品av在线 | 黄污在线观看 | 中文字幕精品久久 | 中文字幕在线观看国产 | 在线欧美中文字幕 | 91精品国产网站 | 伊人午夜视频 | 五月天天av | 国产成人99久久亚洲综合精品 | 亚洲人成精品久久久久 | 久久电影网站中文字幕 | 午夜精品福利影院 | 国产h在线播放 | 国产精品一区在线观看你懂的 | 毛片www| av大全在线免费观看 | 最近中文字幕免费av | 国产中文a | 久久综合色婷婷 | 国产亚洲欧美日韩高清 | 亚洲视频在线免费看 | 日韩乱码在线 | 日韩高清一区在线 | 国产黄色看片 | 国产丝袜美腿在线 | 激情欧美一区二区免费视频 | 亚洲专区在线播放 | 区一区二区三在线观看 | 三级视频国产 | 欧美电影在线观看 | 日韩欧美成 | www.亚洲激情.com | 激情av在线资源 | 精品久久久久免费极品大片 | 精品96久久久久久中文字幕无 | 久久大香线蕉app | 日韩欧美在线中文字幕 | 国产精品一区二区三区在线播放 | 亚洲男男gaygayxxxgv| a级片韩国| 国产一级黄大片 | 国产午夜三级一区二区三桃花影视 | 69中文字幕 | .精品久久久麻豆国产精品 亚洲va欧美 | 亚洲男人天堂a | 国产亚洲精品久久久久久大师 | 欧美日韩免费一区 | 成人av资源网站 | 国产五十路毛片 | 国产高清视频免费在线观看 | 久久丝袜视频 | 97国产大学生情侣酒店的特点 | 日本中文字幕在线免费观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 成人永久免费 | 中文字幕免费观看全部电影 | 一本色道久久综合亚洲二区三区 | 亚洲精品玖玖玖av在线看 | 色婷在线 | 久久久夜色 | 欧美网站黄色 | 久久综合婷婷 | 91精彩视频在线观看 | 久久久久国产精品免费 | 四虎永久精品在线 | 国产高清在线a视频大全 | 久久免费片| 亚洲视频,欧洲视频 | 日韩电影在线观看一区二区 | 亚洲九九九在线观看 | 国产成人在线播放 | 偷拍区另类综合在线 | 国产五月色婷婷六月丁香视频 | www.夜夜草| 91在线视频播放 | 99热这里只有精品在线观看 | 蜜桃av久久久亚洲精品 | 色婷婷www| 在线免费观看成人 | 97超碰免费 | 制服丝袜天堂 | 亚洲免费一级 | 欧美在线不卡一区 | 日韩三级久久 | 久久免费福利视频 | 久久精品99精品国产香蕉 | 精品播放| 国产999精品久久久久久绿帽 | 视频二区在线 | 69视频在线 | 免费视频你懂得 | 在线观看成人毛片 | 99精品国产免费久久久久久下载 | 伊人官网| www色com| 国产精品第一 | 国产高清视频免费观看 | 国产精品免费观看国产网曝瓜 | 黄色www在线观看 | 91最新地址永久入口 |