精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實(shí)現(xiàn) React requestIdleCallback 調(diào)度能力

開發(fā) 架構(gòu)
React內(nèi)部實(shí)現(xiàn)了該方法 requestIdleCallback,即一幀空閑執(zhí)行任務(wù),但Schedular + Lane 模式遠(yuǎn)比 requestIdleCallback 復(fù)雜的多。這里我們先通過了解 requestIdleCallback都做了些什么,再嘗試通過 requestAnimationFrame + MessageChannel 來模擬 React 對一幀空閑判斷的實(shí)現(xiàn)。

[[431408]]

本文轉(zhuǎn)載自微信公眾號「ELab團(tuán)隊(duì)」,作者ELab.lijiayu 。轉(zhuǎn)載本文請聯(lián)系ELab團(tuán)隊(duì)公眾號。

1.前言

Elab掘金: React Fiber架構(gòu)淺析[1] 已對 React Fiber架構(gòu) 實(shí)現(xiàn)進(jìn)行了淺析。React內(nèi)部實(shí)現(xiàn)了該方法 requestIdleCallback,即一幀空閑執(zhí)行任務(wù),但Schedular + Lane 模式遠(yuǎn)比 requestIdleCallback 復(fù)雜的多。這里我們先通過了解 requestIdleCallback都做了些什么,再嘗試通過 requestAnimationFrame + MessageChannel 來模擬 React 對一幀空閑判斷的實(shí)現(xiàn)。

2.requestIdleCallback

window.requestIdleCallback()[2]

2.1 概念理解

圖: 簡單描述幀生命周期

RequestIdleCallback 簡單的說,判斷一幀有空閑時(shí)間,則去執(zhí)行某個(gè)任務(wù)。

目的是為了解決當(dāng)任務(wù)需要長時(shí)間占用主進(jìn)程,導(dǎo)致更高優(yōu)先級任務(wù)(如動畫或事件任務(wù)),無法及時(shí)響應(yīng),而帶來的頁面丟幀(卡死)情況。

故RequestIdleCallback 定位處理的是: 不重要且不緊急的任務(wù)。

RequestIdleCallback 參數(shù)說明:

  • window.requestIdleCallback(callback[, options]); callback為要執(zhí)行的回調(diào)函數(shù),該函數(shù)會接收deadline作為對象。
  1. // 回調(diào)函數(shù) 接收 deadline 
  2.  
  3. type Deadline = { 
  4.  
  5.   timeRemaining: () => number // 當(dāng)前剩余的可用時(shí)間。即該幀剩余時(shí)間。 
  6.  
  7.   didTimeout: boolean // 是否超時(shí)。 
  8.  
  9.  
  10.  
  11.  
  12. // 接收回調(diào)任務(wù) 
  13.  
  14. type RequestIdleCallback = (cb: (deadline: Deadline) => void, options?: Options) => number  

2.2 實(shí)現(xiàn)demo

requestIdleCallback 處理任務(wù)說明:

Demo: https://linjiayu6.github.io/FE-RequestIdleCallback-demo/

Github: RequestIdleCallback 實(shí)驗(yàn)[3]

  1. const bindClick = id =>  
  2.  
  3.   element(id).addEventListener('click'Work.onAsyncUnit) 
  4.  
  5. // 綁定click事件 
  6.  
  7. bindClick('btnA'
  8.  
  9. bindClick('btnB'
  10.  
  11. bindClick('btnC'
  12.  
  13.  
  14.  
  15. var Work = { 
  16.  
  17.     // 有1萬個(gè)任務(wù) 
  18.  
  19.     unit: 10000, 
  20.  
  21.     // 處理單個(gè)任務(wù)需要處理如下 
  22.  
  23.     onOneUnit: function () {  for (var i = 0; i <= 500000; i++) {} }, 
  24.  
  25.      
  26.  
  27.     // 處理任務(wù) 
  28.  
  29.     onAsyncUnit: function () { 
  30.  
  31.         // 空閑時(shí)間基準(zhǔn)為 1ms 
  32.  
  33.         const FREE_TIME = 1 
  34.  
  35.         // 執(zhí)行到第幾個(gè)任務(wù) 
  36.  
  37.         let _u = 0 
  38.  
  39.  
  40.  
  41.         function cb(deadline) { 
  42.  
  43.             // 當(dāng)任務(wù)還沒有被處理完 & 一幀還有的空閑時(shí)間 > 1ms 
  44.  
  45.             while (_u < Work.unit && deadline.timeRemaining() > FREE_TIME) { 
  46.  
  47.                 Work.onOneUnit() 
  48.  
  49.                 _u ++ 
  50.  
  51.             } 
  52.  
  53.             // 任務(wù)干完, 執(zhí)行回調(diào) 
  54.  
  55.             if (_u >= Work.unit) { 
  56.  
  57.                 // 執(zhí)行回調(diào) 
  58.  
  59.                 return 
  60.  
  61.             } 
  62.  
  63.             // 任務(wù)沒完成, 繼續(xù)等空閑執(zhí)行 
  64.  
  65.             window.requestIdleCallback(cb) 
  66.  
  67.         } 
  68.  
  69.         window.requestIdleCallback(cb) 
  70.  
  71.     } 
  72.  

以上是 window.requestIdleCallback 的實(shí)現(xiàn)流程。

核心: 即瀏覽器去在一幀有空閑的情況下,去執(zhí)行某個(gè)低優(yōu)先級的任務(wù)。

2.3 缺陷

MAY BE OFFTOPIC: requestIdleCallback is called only 20 times per second - Chrome on my 6x2 core Linux machine, it's not really useful for UI work. requestAnimationFrame is called more often, but specific for the task which name suggests.[4]

  • 實(shí)驗(yàn) api,兼容情況一般。
  • 實(shí)驗(yàn)結(jié)論: requestIdleCallback FPS只有20ms,正常情況下渲染一幀時(shí)長控制在16.67ms (1s / 60 = 16.67ms)。該時(shí)間是高于頁面流暢的訴求。
  • 個(gè)人認(rèn)為: RequestIdleCallback 不重要且不緊急的定位。因?yàn)镽eact渲染內(nèi)容,并非是不重要且不緊急。不僅該api兼容一般,幀渲染能力一般,也不太符合渲染訴求,故React 團(tuán)隊(duì)自行實(shí)現(xiàn)。

3.React requestIdleCallback 實(shí)現(xiàn)實(shí)驗(yàn)

想要實(shí)現(xiàn)requestIdleCallback的處理,有2個(gè)點(diǎn)需要解決:

  • When: 如何判斷一幀是否有空閑?
  • Where: 如果有了空閑,在一幀中哪里去執(zhí)行任務(wù)?

3.1 requestAnimationFrame 計(jì)算一幀到期時(shí)間點(diǎn)

requestAnimationFrame[5]

是由系統(tǒng)來決定回調(diào)函數(shù)的執(zhí)行時(shí)機(jī)。 它會把每一幀中的所有DOM操作集中起來,在一次重繪或回流中就完成,并且重繪或回流的時(shí)間間隔緊緊跟隨屏幕的刷新頻率,不會引起丟幀和卡頓。

瀏覽器刷新率在60Hz, 渲染一幀時(shí)長控制在16.67ms (1s / 60 = 16.67ms)。

DOMHighResTimeStamp[6]

requestAnimationFrame 參數(shù)如下:

  1. // 回調(diào)函數(shù) 接收 rafTime 即 開始執(zhí)行一幀的開始時(shí)間 
  2.  
  3. // 接收回調(diào)任務(wù) 
  4.  
  5. type RequestAnimationFrame = (cb: (rafTime: number) => void) 

計(jì)算一幀用到期的時(shí)間點(diǎn)。

  1. // 計(jì)算出當(dāng)前幀 結(jié)束時(shí)間 
  2.  
  3. var deadlineTime; 
  4.  
  5. window.selfRequestIdleCallback = function (cb) { 
  6.  
  7.     requestAnimationFrame(rafTime => { 
  8.  
  9.         // 結(jié)束時(shí)間 = 開始時(shí)間 + 一幀用時(shí)16.667ms 
  10.  
  11.         deadlineTime = rafTime + 16.667 
  12.  
  13.         // ......  
  14.  
  15.     }) 
  16.  

以上使用 requestAnimationFrame 來計(jì)算結(jié)束的時(shí)間點(diǎn)。

我們暫且將空閑時(shí)間的判斷放到后面去解決,先來看在時(shí)間充裕情況下,在什么時(shí)機(jī)去執(zhí)行某任務(wù)。

3.2 MessageChannel 宏任務(wù) 執(zhí)行任務(wù)

MessageChannel()[7]

MessageChannel創(chuàng)建了一個(gè)通信的管道,這個(gè)管道有兩個(gè)端口,每個(gè)端口都可以通過postMessage發(fā)送數(shù)據(jù),而一個(gè)端口只要綁定了onmessage回調(diào)方法,就可以接收從另一個(gè)端口傳過來的數(shù)據(jù)。

在看著方法實(shí)現(xiàn)之前,你可能有疑問:

為什么使用宏任務(wù)處理呢?

核心是將主進(jìn)程讓出,將瀏覽器去更新頁面。

利用事件循環(huán)機(jī)制,在下一幀宏任務(wù)的時(shí)候,執(zhí)行未完成的任務(wù)。

為什么不是微任務(wù)?

走遠(yuǎn)了。對一個(gè)事件循環(huán)機(jī)制來說,在頁面更新前,會將所有的微任務(wù)全部執(zhí)行完,故無法達(dá)成將主線程讓出給瀏覽器的目的。

既然用了宏任務(wù),那為什么不使用 setTimeout 宏任務(wù)執(zhí)行呢?

如果不支持MessageChannel的話,就會去用 setTimeout 來執(zhí)行,只是退而求其次的辦法。

現(xiàn)實(shí)情況是: 瀏覽器在執(zhí)行 setTimeout() 和 setInterval() 時(shí),會設(shè)定一個(gè)最小的時(shí)間閾值,一般是 4ms。

  1. var i = 0 
  2.  
  3. var _start = +new Date() 
  4.  
  5. function fn() { 
  6.  
  7.   setTimeout(() => { 
  8.  
  9.     console.log("執(zhí)行次數(shù), 時(shí)間", ++i, +new Date() - _start) 
  10.  
  11.     if (i === 10) { 
  12.  
  13.       return 
  14.  
  15.     } 
  16.  
  17.     fn() 
  18.  
  19.   }, 0) 
  20.  
  21.  
  22. fn() 

故,利用MessageChannel來執(zhí)行宏任務(wù),且模擬setTimeout(fn, 0),還沒有時(shí)延哦。

實(shí)現(xiàn)如下:

  1. // 計(jì)算出當(dāng)前幀 結(jié)束時(shí)間點(diǎn) 
  2.  
  3. var deadlineTime 
  4.  
  5. // 保存任務(wù) 
  6.  
  7. var callback 
  8.  
  9. // 建立通信 
  10.  
  11. var channel = new MessageChannel() 
  12.  
  13. var port1 = channel.port1; 
  14.  
  15. var port2 = channel.port2; 
  16.  
  17.  
  18.  
  19. // 接收并執(zhí)行宏任務(wù) 
  20.  
  21. port2.onmessage = () => { 
  22.  
  23.     // 判斷當(dāng)前幀是否還有空閑,即返回的是剩下的時(shí)間 
  24.  
  25.     const timeRemaining = () => deadlineTime - performance.now(); 
  26.  
  27.     const _timeRemain = timeRemaining(); 
  28.  
  29.     // 有空閑時(shí)間 且 有回調(diào)任務(wù) 
  30.  
  31.     if (_timeRemain > 0 && callback) { 
  32.  
  33.         const deadline = { 
  34.  
  35.             timeRemaining, // 計(jì)算剩余時(shí)間 
  36.  
  37.             didTimeout: _timeRemain < 0 // 當(dāng)前幀是否完成 
  38.  
  39.         } 
  40.  
  41.         // 執(zhí)行回調(diào) 
  42.  
  43.         callback(deadline) 
  44.  
  45.     } 
  46.  
  47.  
  48. window.requestIdleCallback = function (cb) { 
  49.  
  50.     requestAnimationFrame(rafTime => { 
  51.  
  52.         // 結(jié)束時(shí)間點(diǎn) = 開始時(shí)間點(diǎn) + 一幀用時(shí)16.667ms 
  53.  
  54.         deadlineTime = rafTime + 16.667 
  55.  
  56.         // 保存任務(wù) 
  57.  
  58.         callback = cb 
  59.  
  60.         // 發(fā)送個(gè)宏任務(wù) 
  61.  
  62.         port1.postMessage(null); 
  63.  
  64.     }) 
  65.  

4.React 源碼 requestHostCallback

SchedulerHostConfig.js[8]

執(zhí)行宏任務(wù)(回調(diào)任務(wù))

  • requestHostCallback: 觸發(fā)一個(gè)宏任務(wù) performWorkUntilDeadline。
  • performWorkUntilDeadline: 宏任務(wù)處理。
    • 是否有富裕時(shí)間, 有則執(zhí)行。
    • 執(zhí)行該回調(diào)任務(wù)后,是否還有下一個(gè)回調(diào)任務(wù), 即判斷 hasMoreWork。
    • 有則繼續(xù)執(zhí)行 port.postMessage(null);
  1. let scheduledHostCallback = null
  2.  
  3. let isMessageLoopRunning = false
  4.  
  5.  
  6. const channel = new MessageChannel(); 
  7.  
  8. // port2 發(fā)送 
  9.  
  10. const port = channel.port2; 
  11.  
  12. // port1 接收 
  13.  
  14. channel.port1.onmessage = performWorkUntilDeadline; 
  15.  
  16. const performWorkUntilDeadline = () => { 
  17.  
  18.   // 有執(zhí)行任務(wù) 
  19.  
  20.   if (scheduledHostCallback !== null) { 
  21.  
  22.     const currentTime = getCurrentTime(); 
  23.  
  24.     // Yield after `yieldInterval` ms, regardless of where we are in the vsync 
  25.  
  26.     // cycle. This means there's always time remaining at the beginning of 
  27.  
  28.     // the message event. 
  29.  
  30.     // 計(jì)算一幀的過期時(shí)間點(diǎn) 
  31.  
  32.     deadline = currentTime + yieldInterval; 
  33.  
  34.     const hasTimeRemaining = true
  35.  
  36.     try { 
  37.  
  38.       // 執(zhí)行完該回調(diào)后, 判斷后續(xù)是否還有其他任務(wù) 
  39.  
  40.       const hasMoreWork = scheduledHostCallback( 
  41.  
  42.         hasTimeRemaining, 
  43.  
  44.         currentTime, 
  45.  
  46.       ); 
  47.  
  48.       if (!hasMoreWork) { 
  49.  
  50.         isMessageLoopRunning = false
  51.  
  52.         scheduledHostCallback = null
  53.  
  54.       } else { 
  55.  
  56.         // If there's more work, schedule the next message event at the end 
  57.  
  58.         // of the preceding one. 
  59.  
  60.         // 還有其他任務(wù), 推進(jìn)進(jìn)入下一個(gè)宏任務(wù)隊(duì)列中 
  61.  
  62.         port.postMessage(null); 
  63.  
  64.       } 
  65.  
  66.     } catch (error) { 
  67.  
  68.       // If a scheduler task throws, exit the current browser task so the 
  69.  
  70.       // error can be observed. 
  71.  
  72.       port.postMessage(null); 
  73.  
  74.       throw error; 
  75.  
  76.     } 
  77.  
  78.   } else { 
  79.  
  80.     isMessageLoopRunning = false
  81.  
  82.   } 
  83.  
  84.   // Yielding to the browser will give it a chance to paint, so we can 
  85.  
  86.   // reset this. 
  87.  
  88.   needsPaint = false
  89.  
  90. }; 
  91.  
  92. // requestHostCallback 一幀中執(zhí)行任務(wù) 
  93.  
  94. requestHostCallback = function(callback) { 
  95.  
  96.   // 回調(diào)注冊 
  97.  
  98.   scheduledHostCallback = callback; 
  99.  
  100.   if (!isMessageLoopRunning) { 
  101.  
  102.     isMessageLoopRunning = true
  103.  
  104.     // 進(jìn)入宏任務(wù)隊(duì)列 
  105.  
  106.     port.postMessage(null); 
  107.  
  108.   } 
  109.  
  110. }; 
  111.  
  112. cancelHostCallback = function() { 
  113.  
  114.   scheduledHostCallback = null
  115.  
  116. }; 

參考資料

[1]Elab掘金: React Fiber架構(gòu)淺析: https://juejin.cn/post/7005880269827735566

[2]window.requestIdleCallback(): https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestIdleCallback

[3]RequestIdleCallback 實(shí)驗(yàn): https://github.com/Linjiayu6/FE-RequestIdleCallback-demo

[4]MAY BE OFFTOPIC: requestIdleCallback is called only 20 times per second - Chrome on my 6x2 core Linux machine, it's not really useful for UI work. requestAnimationFrame is called more often, but specific for the task which name suggests.: https://github.com/facebook/react/issues/13206#issuecomment-418923831

[5]requestAnimationFrame: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame

[6]DOMHighResTimeStamp: https://developer.mozilla.org/zh-CN/docs/Web/API/DOMHighResTimeStamp

[7]MessageChannel(): https://developer.mozilla.org/zh-CN/docs/Web/API/MessageChannel/MessageChannel

[8]SchedulerHostConfig.js: https://github.com/facebook/react/blob/v17.0.1/packages/scheduler/src/forks/SchedulerHostConfig.default.js

 

責(zé)任編輯:武曉燕 來源: ELab團(tuán)隊(duì)
相關(guān)推薦

2021-12-16 06:21:16

React組件前端

2022-12-06 08:30:06

SchedulerReact

2025-10-28 01:45:00

setTimeouAPI日志

2009-10-13 10:37:14

自然災(zāi)害應(yīng)急預(yù)案

2021-12-26 12:10:21

React組件前端

2023-04-17 08:13:13

KubernetesPod

2022-01-10 08:31:29

React組件前端

2010-07-29 11:34:31

多媒體調(diào)度系統(tǒng)MDS捷思銳

2023-05-08 16:38:46

任務(wù)調(diào)度分布式任務(wù)調(diào)度

2023-04-07 15:12:46

ReactReact-Intl

2022-05-15 22:08:58

ReactHookdebounce

2010-08-12 15:38:39

IT運(yùn)維網(wǎng)管軟件摩卡軟件

2023-12-26 07:44:00

Spring定時(shí)調(diào)度

2021-02-01 11:30:13

React前端調(diào)度

2020-10-28 09:12:48

React架構(gòu)Hooks

2020-10-21 08:38:47

React源碼

2022-07-06 08:30:36

vuereactvdom

2024-10-21 09:18:47

2023-03-01 09:39:40

調(diào)度系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲日本在线播放| 青青操视频在线播放| 在线能看的av网址| 久久奇米777| 国产成人在线视频| 国产精品久久久久久成人| 亚洲欧美专区| 亚洲午夜一二三区视频| 精品一区二区三区自拍图片区| 国产超碰人人爽人人做人人爱| 一区二区美女| 欧美日韩视频在线第一区| 伊人久久大香线蕉av一区| av综合在线观看| 在线看片成人| 日韩视频免费观看高清完整版| 日本欧美视频在线观看| 男女av在线| 精品一区在线看| 国语对白做受69| 在线观看日本中文字幕| 成人在线视频播放| 亚洲精品国产成人久久av盗摄 | 日本动漫同人动漫在线观看| www.亚洲人| 国产精品色婷婷视频| 久久亚洲国产成人精品性色| 一本色道久久综合亚洲精品酒店 | 国产69精品一区二区亚洲孕妇| 国内精品久久久久久中文字幕| 久久美女免费视频| 亚洲精品一二三**| 欧美性受xxxx| www.xxx麻豆| 福利在线午夜| 久久人人97超碰com| 国产精品二区二区三区| 999av视频| 蜜臀91精品一区二区三区| 热99久久精品| 日产精品久久久| 亚洲精品一二| 国产69精品久久久| 国产精品自拍视频一区| 韩国精品一区二区三区| 欧美老女人在线视频| 天天操夜夜操av| 欧美残忍xxxx极端| 日韩在线资源网| 又嫩又硬又黄又爽的视频| 成人免费在线观看av| 亚洲欧美www| 无码 人妻 在线 视频| 最新亚洲精品| 国产一区二区三区视频| 国产交换配乱淫视频免费| 欧美理伦片在线播放| 亚洲成人1234| 亚洲AV无码国产精品| 亚洲第一论坛sis| 亚洲视频在线观看| 亚洲一区 欧美| 91一区二区三区四区| 久久精品国产清自在天天线| 黄色精品视频在线观看| 一区二区影院| 欧美高清视频在线播放| 日本三级中文字幕| 国产欧美大片| 国产成人精品免费久久久久 | 久草免费在线色站| 亚洲成av人片观看| 国产av无码专区亚洲精品| 免费看av不卡| 欧美老女人在线| 三上悠亚 电影| 日韩精品免费一区二区夜夜嗨 | 蜜臀av国内免费精品久久久夜夜| 亚洲国产日韩在线一区模特| 欧美 日韩 激情| 一呦二呦三呦精品国产| 欧美日本精品一区二区三区| 日本一本在线视频| 欧美一级三级| 一区二区三区国产视频| 99精品久久久久| 国产精品日韩| 成人免费视频网址| 开心激情综合网| 欧美国产禁国产网站cc| 久久久久久久免费视频| 黄视频网站在线观看| 91福利精品视频| 久久发布国产伦子伦精品| 日韩精品福利一区二区三区| www.久久久久| 男女视频免费看| 久久精品国产99国产精品| 999精品在线观看| 美女做暖暖视频免费在线观看全部网址91 | 欧美午夜精品伦理| 色91精品久久久久久久久| 粉嫩av一区二区| 日韩在线观看你懂的| 免费毛片在线播放免费| 全部av―极品视觉盛宴亚洲| 国产精品久久亚洲7777| 97最新国自产拍视频在线完整在线看| 一区二区三区在线视频观看| 久久久久久久久久久免费视频| 在线观看亚洲精品福利片| 日韩大片在线观看视频| 一区二区三区影视| 久久婷婷激情| 国产精品视频入口| 毛片av在线| 色婷婷激情综合| 永久免费未满蜜桃| 91成人看片| 国产精品色午夜在线观看| 天堂在线视频免费| 一区二区三区免费在线观看| 中文字幕国产免费| sdde在线播放一区二区| 69久久夜色精品国产69乱青草| 国产一区二区三区四区视频| 久久久精品国产免大香伊| 国产精品无码电影在线观看| 六九午夜精品视频| 有码中文亚洲精品| 亚洲成人第一网站| 99国产精品一区| 日韩精品一区在线视频| 超碰在线成人| 欧美激情精品久久久久久久变态| 国产精品久久久久久久久久久久久久久久| 国产亚洲欧洲一区高清在线观看| 亚洲中文字幕无码av永久| 日本成人精品| 欧美尺度大的性做爰视频| 国产裸体无遮挡| 日韩美女精品在线| 九一精品久久久| 91精品天堂福利在线观看 | av不卡一区| 欧美激情伊人电影| 人妻精品无码一区二区| 亚洲一区视频在线观看视频| 欧美午夜精品一区二区| 欧美久久综合| 91一区二区三区| 中文字幕中文字幕在线十八区| 这里只有精品视频在线观看| 日本激情视频一区二区三区| 韩国精品免费视频| 色哟哟免费网站| 777久久精品| 91国产一区在线| 国产小视频免费在线网址| 91久久一区二区| 少妇高潮惨叫久久久久| 久久99精品久久久久久| 最新av网址在线观看| 91麻豆精品激情在线观看最新| 欧美福利视频网站| 色呦呦中文字幕| 色婷婷激情久久| 欧美视频一区二区在线| 国产精品99久久久久久宅男| 免费极品av一视觉盛宴| 国产精品久久久久av蜜臀| 人妖精品videosex性欧美| 国产精品一级伦理| 7777女厕盗摄久久久| 国产一级淫片免费| 91视频你懂的| 91看片在线免费观看| 午夜精品亚洲| 久久精品国产一区二区三区日韩| 成人在线网站| 欧美床上激情在线观看| 日韩大胆人体| 欧美日韩国产a| 中文字幕第28页| 国产婷婷色一区二区三区| 中文字幕 欧美日韩| 亚洲人成在线影院| 日韩精品不卡| 亚洲91网站| 国产精品444| 亚洲卡一卡二| 国产一区二区三区18| 午夜精品久久久久久久第一页按摩 | 日韩一二区视频| 日韩精品丝袜美腿| 成人国产精品久久久| 成人免费观看在线观看| 中文字幕精品www乱入免费视频| www.日本在线观看| 欧美亚洲一区二区在线| 久久久久久久久艹| 国产欧美视频一区二区| 国产一级免费片| 久久99精品久久久久| 男人操女人免费| 欧美三级第一页| 亚洲最新在线| 久久99国内| 国产精品手机在线| 国产不卡精品在线| 国产精品夜色7777狼人| 中文字幕在线直播| 久久久久久12| 黄色免费在线网站| 在线精品播放av| 欧美扣逼视频| 日韩不卡中文字幕| 亚洲AV无码一区二区三区性| 欧美日本在线播放| 国产男人搡女人免费视频| 婷婷丁香久久五月婷婷| 国产亚洲精品久久久久久无几年桃 | av资源网在线播放| 欧美成人激情图片网| av在线三区| 亚洲欧美日韩天堂| 性xxxx视频播放免费| 日韩一级免费一区| 国产精品久久久久久无人区| 在线观看成人免费视频| 99久久久无码国产精品免费蜜柚| 欧美日韩国产影院| 国产成人无码精品久久久久| 亚洲一区视频在线| 精品少妇久久久久久888优播| 亚洲精品中文在线影院| 久久国产高清视频| 18欧美乱大交hd1984| 少妇高潮在线观看| 亚洲三级在线看| www深夜成人a√在线| 亚洲欧美在线另类| 中文字幕求饶的少妇| **性色生活片久久毛片| 夫妻性生活毛片| 亚洲免费视频成人| 久草免费在线视频观看| 亚洲成人自拍一区| 在线观看中文字幕视频| 欧美性xxxx极品hd满灌| 中文字幕免费观看| 在线区一区二视频| 亚洲系列在线观看| 7777精品伊人久久久大香线蕉最新版| 国产又粗又猛视频| 日韩一区二区精品在线观看| 国产黄频在线观看| 亚洲国产黄色片| 青青草在线播放| 在线观看日韩www视频免费| av午夜在线| 久久国产精品影片| 动漫一区二区| 欧美做受高潮电影o| 色猫猫成人app| 92看片淫黄大片欧美看国产片| 亚洲视频精选| 欧美国产综合视频| 99热精品久久| 97在线国产视频| 免播放器亚洲| 亚洲欧美自偷自拍另类| 国产美女精品一区二区三区| av电影中文字幕| 久久综合999| 农村老熟妇乱子伦视频| 一区二区免费视频| 亚洲AV无码成人精品区东京热| 欧美性色黄大片| 精品久久国产视频| 亚洲欧美成人网| 18加网站在线| 国产999视频| 国产精品久久久久久久久久久久久久久 | 亚洲精品v日韩精品| 久久艹免费视频| 欧美精品乱码久久久久久 | 欧美性www| 国产日韩精品推荐| 日韩dvd碟片| 欧美深夜福利视频| 九九久久精品视频| 自拍视频一区二区| 亚洲男人天堂av| 精品国产午夜福利| 日韩欧美一二三| 高h视频在线| 97在线观看视频国产| 日韩毛片免费看| 久久综合入口| 欧美日韩国产一区精品一区| 日韩免费高清在线| 丁香婷婷综合激情五月色| 国产精品成人在线视频| 欧美日韩免费观看中文| 国产视频www| 国产亚洲一区精品| 国产拍在线视频| 91亚洲精品久久久| 欧美中文一区二区| 国产肥臀一区二区福利视频| 国产精品69毛片高清亚洲| 成人免费视频入口| 欧美性xxxx在线播放| 亚洲精品一区二区三区蜜桃 | 成人一级黄色大片| 在线免费观看不卡av| 五月激情六月婷婷| 久久久久国产视频| 日韩国产在线不卡视频| 中文字幕一区二区三区最新| 久久最新视频| 在线观看国产免费视频| 亚洲综合久久久久| 精品久久人妻av中文字幕| 在线成人动漫av| 91在线免费观看网站| 第九色区aⅴ天堂久久香| 69堂免费视频| www.亚洲免费av| 国产在线一二区| 精品美女一区二区| 羞羞视频在线观看不卡| 亚洲淫片在线视频| 久久久五月天| 色婷婷激情视频| 亚洲欧洲在线观看av| 亚洲一区二区影视| 久久精品国产亚洲7777| 日韩成人在线一区| 自拍偷拍亚洲色图欧美| 久久精品国产色蜜蜜麻豆| 91无套直看片红桃在线观看| 在线观看日韩高清av| 国产区视频在线播放| 国产精品福利观看| 波多野结衣在线观看一区二区| 人妻无码视频一区二区三区| 久久综合一区二区| 日韩视频在线观看一区| 亚洲欧美国产一本综合首页| 欧美性xxx| 五月天亚洲综合小说网| 看国产成人h片视频| 情侣偷拍对白清晰饥渴难耐| 91精品国产91久久综合桃花 | 亚洲视频网在线直播| 国产精品一品二区三区的使用体验| y97精品国产97久久久久久| 超碰国产精品一区二页| 日本美女爱爱视频| 成人app下载| 精品免费囯产一区二区三区 | 国产伦理片在线观看| 欧美系列亚洲系列| 久操视频在线免费播放| 69堂成人精品视频免费| 一本色道久久| av永久免费观看| 日韩欧美一二三区| 97成人资源| 一本一本a久久| 成人免费视频视频| 人人草在线观看| 日韩一区在线视频| 国产 日韩 欧美 综合 一区| 欧洲av无码放荡人妇网站| 国产精品国产精品国产专区不蜜| 国产视频一区二区三区四区五区| 欧美激情在线播放| 国产一区日韩| 日本55丰满熟妇厨房伦| 丁香五六月婷婷久久激情| av电影在线网| 国产精品免费视频一区二区| 日韩av中文字幕一区二区三区| 欧美一区免费观看| 亚洲精品一区二区三区不| 日韩伦理一区二区| 国产精品333| 亚洲人成网站影音先锋播放| 外国精品视频在线观看 | 国产精品毛片久久久| 日本在线视频www| 亚洲免费av网站| 九色视频网站在线观看| 97av自拍| 日韩电影一区二区三区| 国产乡下妇女做爰| 精品国产一区久久久|