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

Vsync 信號機制和 UI 刷新流程

移動開發 Android
Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,VSync是Vertical Synchronization(垂直同步)的縮寫,是一種在PC上很早就廣泛使用的技術,可以簡單的把它認為是一種定時中斷。而在Android 4.1(JB)中已經開始引入VSync機制。

[[439732]]

 

前言

屏幕刷新幀率不穩定,掉幀嚴重,無法保證每秒60幀,導致屏幕畫面撕裂;

今天我們來講解下VSYNC機制和UI刷新流程

一、 Vsync信號詳解

1、屏幕刷新相關知識點

  • 屏幕刷新頻率:一秒內屏幕刷新的次數(一秒內顯示了多少幀的圖像),單位 Hz(赫茲),如常見的 60 Hz。刷新頻率取決于硬件的固定參數(不會變的);
  • 逐行掃:顯示器并不是一次性將畫面顯示到屏幕上,而是從左到右邊,從上到下逐行掃描,順序顯示整屏的一個個像素點,不過這一過程快到人眼無法察覺到變化。以 60 Hz 刷新率的屏幕為例,這一過程即 1000 / 60 ≈ 16ms;
  • 幀率:表示 GPU 在一秒內繪制操作的幀數,單位 fps。例如在電影界采用 24 幀的速度足夠使畫面運行的非常流暢。而 Android 系統則采用更加流程的 60 fps,即每秒鐘GPU最多繪制 60 幀畫面。幀率是動態變化的,例如當畫面靜止時,GPU 是沒有繪制操作的,屏幕刷新的還是buffer中的數據,即GPU最后操作的幀數據;
  • 屏幕流暢度:即以每秒60幀(每幀16.6ms)的速度運行,也就是60fps,并且沒有任何延遲或者掉幀;
  • FPS:每秒的幀數;
  • 丟幀:在16.6ms完成工作卻因各種原因沒做完,占了后n個16.6ms的時間,相當于丟了n幀;

2、VSYNC機制

VSync機制:Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,VSync是Vertical Synchronization(垂直同步)的縮寫,是一種在PC上很早就廣泛使用的技術,可以簡單的把它認為是一種定時中斷。而在Android 4.1(JB)中已經開始引入VSync機制;

VSync機制下的繪制過程;CPU/GPU接收vsync信號,Vsync每16ms一次,那么在每次發出Vsync命令時,CPU都會進行刷新的操作。也就是在每個16ms的第一時間,CPU就會響應Vsync的命令,來進行數據刷新的動作。CPU和GPU的刷新時間,和Display的FPS是一致的。因為只有到發出Vsync命令的時候,CPU和GPU才會進行刷新或顯示的動作。CPU/GPU接收vsync信號提前準備下一幀要顯示的內容,所以能夠及時準備好每一幀的數據,保證畫面的流暢;

可見vsync信號沒有提醒CPU/GPU工作的情況下,在第一個16ms之內,一切正常。然而在第二個16ms之內,幾乎是在時間段的最后CPU才計算出了數據,交給了Graphics Driver,導致GPU也是在第二段的末尾時間才進行了繪制,整個動作延后到了第三段內。從而影響了下一個畫面的繪制。這時會出現Jank(閃爍,可以理解為卡頓或者停頓)。這時候CPU和GPU可能被其他操作占用了,這就是卡頓出現的原因;

二、UI刷新原理流程

1、VSYNC流程示意

當我們通過setText改變TextView內容后,UI界面不會立刻改變,APP端會先向VSYNC服務請求,等到下一次VSYNC信號觸發后,APP端的UI才真的開始刷新,基本流程如下:

setText最終調用invalidate申請重繪,最后會通過ViewParent遞歸到ViewRootImpl的invalidate,請求VSYNC,在請求VSYNC的時候,會添加一個同步柵欄,防止UI線程中同步消息執行,這樣做為了加快VSYNC的響應速度,如果不設置,VSYNC到來的時候,正在執行一個同步消息;

2、view的invalidate

View會遞歸的調用父容器的invalidateChild,逐級回溯,最終走到ViewRootImpl的invalidate

  1. View.java 
  2.  void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache, 
  3.             boolean fullInvalidate) { 
  4.             // Propagate the damage rectangle to the parent view
  5.             final AttachInfo ai = mAttachInfo; 
  6.             final ViewParent p = mParent; 
  7.             if (p != null && ai != null && l < r && t < b) { 
  8.                 final Rect damage = ai.mTmpInvalRect; 
  9.                 damage.set(l, t, r, b); 
  10.                 p.invalidateChild(this, damage); 
  11.             } 
  12. ViewRootImpl.java 
  13. void invalidate() { 
  14.     mDirty.set(0, 0, mWidth, mHeight); 
  15.     if (!mWillDrawSoon) { 
  16.         scheduleTraversals(); 
  17.     } 

ViewRootImpl會調用scheduleTraversals準備重繪,但是,重繪一般不會立即執行,而是往Choreographer的Choreographer.CALLBACK_TRAVERSAL隊列中添加了一個mTraversalRunnable,同時申請VSYNC,這個mTraversalRunnable要一直等到申請的VSYNC到來后才會被執行;

3、scheduleTraversals

  1. ViewRootImpl.java 
  2.  // 將UI繪制的mTraversalRunnable加入到下次垂直同步信號到來的等待callback中去 
  3.  // mTraversalScheduled用來保證本次Traversals未執行前,不會要求遍歷兩邊,浪費16ms內,不需要繪制兩次 
  4. void scheduleTraversals() { 
  5.     if (!mTraversalScheduled) { 
  6.         mTraversalScheduled = true
  7.         // 防止同步柵欄,同步柵欄的意思就是攔截同步消息 
  8.         mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier(); 
  9.         // postCallback的時候,順便請求vnsc垂直同步信號scheduleVsyncLocked 
  10.         mChoreographer.postCallback( 
  11.                 Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); 
  12.          <!--添加一個處理觸摸事件的回調,防止中間有Touch事件過來--> 
  13.         if (!mUnbufferedInputDispatch) { 
  14.             scheduleConsumeBatchedInput(); 
  15.         } 
  16.         notifyRendererOfFramePending(); 
  17.         pokeDrawLockIfNeeded(); 
  18.     } 

4、申請VSYNC同步信號

  1. Choreographer.java 
  2. private void postCallbackDelayedInternal(int callbackType, 
  3.         Object action, Object token, long delayMillis) { 
  4.     synchronized (mLock) { 
  5.         final long now = SystemClock.uptimeMillis(); 
  6.         final long dueTime = now + delayMillis; 
  7.         mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token); 
  8.         if (dueTime <= now) { 
  9.         <!--申請VSYNC同步信號--> 
  10.             scheduleFrameLocked(now); 
  11.         }  
  12.     } 

5、scheduleFrameLocked

  1. // mFrameScheduled保證16ms內,只會申請一次垂直同步信號 
  2. // scheduleFrameLocked可以被調用多次,但是mFrameScheduled保證下一個vsync到來之前,不會有新的請求發出 
  3. // 多余的scheduleFrameLocked調用被無效化 
  4. private void scheduleFrameLocked(long now) { 
  5.     if (!mFrameScheduled) { 
  6.         mFrameScheduled = true
  7.         if (USE_VSYNC) { 
  8.             if (isRunningOnLooperThreadLocked()) { 
  9.                 scheduleVsyncLocked(); 
  10.             } else { 
  11.                 // 因為invalid已經有了同步柵欄,所以必須mFrameScheduled,消息才能被UI線程執行 
  12.                 Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_VSYNC); 
  13.                 msg.setAsynchronous(true); 
  14.                 mHandler.sendMessageAtFrontOfQueue(msg); 
  15.             } 
  16.         }   
  17.     } 
  • 在當前申請的VSYNC到來之前,不會再去請求新的VSYNC,因為16ms內申請兩個VSYNC沒意義;
  • 再VSYNC到來之后,Choreographer利用Handler將FrameDisplayEventReceiver封裝成一個異步Message,發送到UI線程的MessageQueue;

6、FrameDisplayEventReceiver

  1. private final class FrameDisplayEventReceiver extends DisplayEventReceiver 
  2.             implements Runnable { 
  3.         private boolean mHavePendingVsync; 
  4.         private long mTimestampNanos; 
  5.         private int mFrame; 
  6.         public FrameDisplayEventReceiver(Looper looper) { 
  7.             super(looper); 
  8.         } 
  9.         @Override 
  10.         public void onVsync(long timestampNanos, int builtInDisplayId, int frame) { 
  11.             long now = System.nanoTime(); 
  12.             if (timestampNanos > now) { 
  13.             <!--正常情況,timestampNanos不應該大于now,一般是上傳vsync的機制出了問題--> 
  14.                 timestampNanos = now; 
  15.             } 
  16.             <!--如果上一個vsync同步信號沒執行,那就不應該相應下一個(可能是其他線程通過某種方式請求的)--> 
  17.               if (mHavePendingVsync) { 
  18.                 Log.w(TAG, "Already have a pending vsync event.  There should only be " 
  19.                         + "one at a time."); 
  20.             } else { 
  21.                 mHavePendingVsync = true
  22.             } 
  23.             <!--timestampNanos其實是本次vsync產生的時間,從服務端發過來--> 
  24.             mTimestampNanos = timestampNanos; 
  25.             mFrame = frame; 
  26.             Message msg = Message.obtain(mHandler, this); 
  27.             <!--由于已經存在同步柵欄,所以VSYNC到來的Message需要作為異步消息發送過去--> 
  28.             msg.setAsynchronous(true); 
  29.             mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS); 
  30.         } 
  31.         @Override 
  32.         public void run() { 
  33.             mHavePendingVsync = false
  34.             <!--這里的mTimestampNanos其實就是本次Vynsc同步信號到來的時候,但是執行這個消息的時候,可能延遲了--> 
  35.             doFrame(mTimestampNanos, mFrame); 
  36.         } 
  37.     } 
  • 之所以封裝成異步Message,是因為前面添加了一個同步柵欄,同步消息不會被執行;
  • UI線程被喚起,取出該消息,最終調用doFrame進行UI刷新重繪;

7、doFrame

  1. void doFrame(long frameTimeNanos, int frame) { 
  2.     final long startNanos; 
  3.     synchronized (mLock) { 
  4.     <!--做了很多東西,都是為了保證一次16ms有一次垂直同步信號,有一次input 、刷新、重繪--> 
  5.         if (!mFrameScheduled) { 
  6.             return; // no work to do 
  7.         } 
  8.        long intendedFrameTimeNanos = frameTimeNanos; 
  9.         startNanos = System.nanoTime(); 
  10.         final long jitterNanos = startNanos - frameTimeNanos; 
  11.         <!--檢查是否因為延遲執行掉幀,每大于16ms,就多掉一幀--> 
  12.         if (jitterNanos >= mFrameIntervalNanos) { 
  13.             final long skippedFrames = jitterNanos / mFrameIntervalNanos; 
  14.             <!--跳幀,其實就是上一次請求刷新被延遲的時間,但是這里skippedFrames為0不代表沒有掉幀--> 
  15.             if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) { 
  16.             <!--skippedFrames很大一定掉幀,但是為 0,去并非沒掉幀--> 
  17.                 Log.i(TAG, "Skipped " + skippedFrames + " frames!  " 
  18.                         + "The application may be doing too much work on its main thread."); 
  19.             } 
  20.             final long lastFrameOffset = jitterNanos % mFrameIntervalNanos; 
  21.                 <!--開始doFrame的真正有效時間戳--> 
  22.             frameTimeNanos = startNanos - lastFrameOffset; 
  23.         } 
  24.         if (frameTimeNanos < mLastFrameTimeNanos) { 
  25.             <!--這種情況一般是生成vsync的機制出現了問題,那就再申請一次--> 
  26.             scheduleVsyncLocked(); 
  27.             return
  28.         } 
  29.           <!--intendedFrameTimeNanos是本來要繪制的時間戳,frameTimeNanos是真正的,可以在渲染工具中標識延遲VSYNC多少--> 
  30.         mFrameInfo.setVsync(intendedFrameTimeNanos, frameTimeNanos); 
  31.         <!--移除mFrameScheduled判斷,說明處理開始了,--> 
  32.         mFrameScheduled = false
  33.         <!--更新mLastFrameTimeNanos--> 
  34.         mLastFrameTimeNanos = frameTimeNanos; 
  35.     } 
  36.     try { 
  37.          <!--真正開始處理業務--> 
  38.         Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame"); 
  39.         <!--處理打包的move事件--> 
  40.         mFrameInfo.markInputHandlingStart(); 
  41.         doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); 
  42.         <!--處理動畫--> 
  43.         mFrameInfo.markAnimationsStart(); 
  44.         doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos); 
  45.         <!--處理重繪--> 
  46.         mFrameInfo.markPerformTraversalsStart(); 
  47.         doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); 
  48.         <!--提交-> 
  49.         doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); 
  50.     } finally { 
  51.         Trace.traceEnd(Trace.TRACE_TAG_VIEW); 
  52.     } 
  • doTraversal會先將柵欄移除,然后處理performTraversals,進行測量、布局、繪制,提交當前幀給SurfaceFlinger進行圖層合成顯示;
  • 以上多個boolean變量保證了每16ms最多執行一次UI重繪;

9、UI局部重繪

View重繪刷新,并不會導致所有View都進行一次measure、layout、draw,只是這個待刷新View鏈路需要調整,剩余的View可能不需要浪費精力再來一遍;

  1. View.java 
  2.     public RenderNode updateDisplayListIfDirty() { 
  3.         final RenderNode renderNode = mRenderNode; 
  4.           ... 
  5.         if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 
  6.                 || !renderNode.isValid() 
  7.                 || (mRecreateDisplayList)) { 
  8.            <!--失效了,需要重繪--> 
  9.         } else { 
  10.         <!--依舊有效,無需重繪--> 
  11.             mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID; 
  12.             mPrivateFlags &= ~PFLAG_DIRTY_MASK; 
  13.         } 
  14.         return renderNode; 
  15.     } 

10、繪制總結

  • android最高60FPS,是VSYNC及決定的,每16ms最多一幀;
  • VSYNC要客戶端主動申請,才會有;
  • 有VSYNC到來才會刷新;
  • UI沒更改,不會請求VSYNC也就不會刷新;

總結

 

關于繪制還有很多知識點,后面會總結陸續發出來的;

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2011-07-05 18:40:19

QT 信號 機制

2011-07-05 18:32:52

QT 信號 機制

2024-07-16 10:52:09

2025-02-03 07:00:00

2017-09-14 09:40:32

PythonUbuntu信號機制

2022-11-03 07:35:47

OS內核異步

2024-11-19 08:09:09

MySQL數據庫數據

2011-06-09 09:45:35

Linux QT 信號

2017-01-16 14:48:42

Linux信號機制分析

2017-01-16 15:05:17

Linux信號機制分析

2011-06-23 13:38:27

QT 元對象 信號

2011-07-15 09:57:03

MongoDB緩存刷新

2011-06-23 14:40:13

Qt 信號

2025-06-25 06:18:46

Linux多線程機制

2021-08-09 14:32:34

鴻蒙HarmonyOS應用

2021-12-08 06:53:28

Choreograph屏幕機制

2020-07-27 08:44:22

存儲Kafka 流程

2025-07-14 00:40:00

Node.js代碼信號

2015-03-26 13:14:53

javascriptjs callback實現調用

2025-08-06 07:47:22

點贊
收藏

51CTO技術棧公眾號

亚洲国产日韩欧美在线| 成人免费毛片嘿嘿连载视频…| 成人免费视频免费观看| 97在线视频免费播放| 无码熟妇人妻av| 久久亚洲精品中文字幕| 亚洲最快最全在线视频| 蜜桃av久久久亚洲精品| 国产精品欧美亚洲| 午夜宅男久久久| 欧美成人亚洲成人| 蜜桃传媒一区二区亚洲| 97久久亚洲| 欧美麻豆精品久久久久久| 每日在线观看av| 免费超碰在线| 久久一留热品黄| 91超碰在线电影| 欧美另类高清videos的特点| 亚洲激情一区| 超薄丝袜一区二区| 国产一二三四五区| av在线亚洲色图| 欧美日韩一区中文字幕| 国产美女网站在线观看| 亚洲资源一区| 国产精品的网站| 日本精品二区| 水莓100国产免费av在线播放| 狠狠久久亚洲欧美| 国产精品久久久999| 欧美日韩综合在线观看| 欧美久久视频| 久久电影一区二区| 婷婷国产成人精品视频| 免费成人高清在线视频theav| 亚洲成在人线av| 97超碰人人看| 免费观看亚洲视频大全| 欧美日本韩国一区| 国产又黄又猛又粗又爽的视频| 日韩欧美精品一区二区三区| 亚洲成人午夜影院| 丝袜人妻一区二区三区| 免费在线观看的电影网站| 最新高清无码专区| 中文字幕超清在线免费观看| 91网页在线观看| 亚洲国产精品成人综合色在线婷婷| 欧美精品123| 欧美少妇另类| 91久色porny| 欧美日韩国产不卡在线看| 无套内谢的新婚少妇国语播放| 成人一级片在线观看| 成人欧美一区二区三区视频| 亚洲a视频在线| 福利一区二区在线观看| 国产厕所精品在线观看| 国产普通话bbwbbwbbw| 久久av老司机精品网站导航| 国产女同一区二区| 国产在成人精品线拍偷自揄拍| 另类人妖一区二区av| 成人激情视频免费在线| 99热这里只有精品在线观看| 国产精品一二三| 国产精品国产精品国产专区蜜臀ah | 国产日韩成人内射视频| 亚洲第一会所001| 欧美久久免费观看| 波多野结衣电影免费观看| 亚洲国产一区二区三区网站| 亚洲成人久久久久| 强伦人妻一区二区三区| 欧美肉体xxxx裸体137大胆| 日韩中文视频免费在线观看| avtt天堂在线| 在线亚洲成人| 国产精品一区二区性色av| 国产精品日韩无码| 成人不卡免费av| 日韩一本精品| gogogogo高清视频在线| 亚洲成人777| 免费一级特黄录像| 免费观看在线一区二区三区| 亚洲第一天堂av| av男人的天堂av| 欧美国产精品| 国产福利精品av综合导导航| 97成人在线观看| 波多野结衣在线一区| 任我爽在线视频精品一| 成人高清免费在线| 欧美三级欧美成人高清www| 性欧美1819| 欧美亚洲色图校园春色| 搡老女人一区二区三区视频tv| 久久网中文字幕| 日韩不卡在线观看日韩不卡视频| 国产精品嫩草视频| 少妇高潮一区二区三区69| 国产精品美女久久久久久久久 | 精品无码久久久久久久动漫| yiren22综合网成人| 亚洲高清在线精品| 九九九九九伊人| 久久av影视| 色综合色综合网色综合| 影音先锋国产资源| 97久久人人超碰| 好吊色视频988gao在线观看| 精品三区视频| 日韩av综合网| 国产亚洲欧美精品久久久久久| 日韩成人av影视| 美脚丝袜一区二区三区在线观看| 久久免费电影| 欧美一区二区三区视频免费播放 | 你懂的一区二区三区| 欧美日韩国产成人在线| 一级日韩一级欧美| 国产亚洲精品久| 波多野结衣乳巨码无在线| 日本精品视频| 久久国产精品久久国产精品| 中文字幕福利视频| 久久色视频免费观看| 日韩黄色短视频| 日韩一区免费| 欧美乱妇40p| 91精品视频免费在线观看| 国产欧美日韩三区| 国产精品少妇在线视频| 四虎5151久久欧美毛片| 97视频在线观看免费| www香蕉视频| 夜夜揉揉日日人人青青一国产精品| 色呦色呦色精品| 亚洲成人av| 成人免费激情视频| 老司机在线看片网av| 欧美日韩成人一区| 小向美奈子av| 激情欧美日韩一区二区| 少妇高潮大叫好爽喷水| 国产日本亚洲| 欧美大片在线看免费观看| 亚洲毛片在线播放| 亚洲国产精品一区二区www在线| 久久久久亚洲av成人网人人软件| 欧美日本一区二区高清播放视频| 97超碰最新| heyzo中文字幕在线| 亚洲成人精品视频| www.国产一区二区| 国产亚洲成aⅴ人片在线观看| 99久久国产宗和精品1上映| 欧美理论电影大全| 国产在线精品播放| 午夜伦理在线视频| 亚洲第一福利网| 台湾佬中文在线| 国产精品拍天天在线| 伊人影院综合在线| 欧美日韩岛国| 精品午夜一区二区| 亚州一区二区三区| 深夜成人在线观看| 国产激情久久久久久熟女老人av| 亚洲超碰精品一区二区| 受虐m奴xxx在线观看| 精品在线免费视频| 精品久久久久久无码中文野结衣| 欧美一性一交| 国产区精品视频| 欧美xxxxhdvideosex| 亚洲精品视频免费在线观看| 国产偷人爽久久久久久老妇app| 综合欧美一区二区三区| 影音先锋人妻啪啪av资源网站| 久久狠狠一本精品综合网| 自拍偷拍一区二区三区| 91精品尤物| 国产精品久久久久91| 性国产高清在线观看| 精品呦交小u女在线| 国产免费福利视频| 欧美午夜影院在线视频| 免费三级在线观看| 91亚洲精品久久久蜜桃| 91小视频在线播放| 性感少妇一区| 欧美日韩dvd| 精品免费视频| 国产精品初高中精品久久| 国产成人精品一区二三区在线观看 | 国产视频在线观看一区| 日韩一级二级| 91精品国产99久久久久久| 在线看黄色av| 亚洲欧美中文另类| 亚洲精品成人电影| 欧美日韩综合一区| 性无码专区无码| 亚洲男同性视频| www.狠狠爱| av中文一区二区三区| 中国黄色片一级| 日韩高清不卡一区二区三区| 欧美精品自拍视频| 综合国产精品| 亚洲综合首页| 欧美人与牛zoz0性行为| 精品国产电影| 成人h动漫精品一区二区器材| 国产欧美日韩中文| 国模一区二区| 国产不卡视频在线| 神马午夜在线视频| 久久久亚洲国产天美传媒修理工| 日本成a人片在线观看| 亚洲色图第三页| 天堂中文网在线| 日韩美女在线视频| av免费观看在线| 欧美日本一区二区三区四区| 懂色av中文字幕| 色综合天天性综合| 国产成人精品片| 亚洲国产精品一区二区尤物区| 成人免费视频国产免费观看| 亚洲欧洲日韩综合一区二区| 青青草华人在线视频| 欧美激情资源网| 国产精品av久久久久久无| 久久久久久免费网| 瑟瑟视频在线观看| 久久一区二区视频| 五月天精品视频| 国产视频一区不卡| 日本高清黄色片| 国产精品久久久久久久久晋中| 影音先锋男人在线| 中文字幕精品在线不卡| 国产主播av在线| 中文字幕一区二区三中文字幕| 精品一区二区在线观看视频| 亚洲欧洲韩国日本视频| 一区二区三区在线播放视频| 中文字幕一区免费在线观看| 九九精品视频免费| 一区二区视频在线| 麻豆91精品91久久久| 亚洲国产乱码最新视频| 六月丁香激情综合| 欧洲色大大久久| 在线免费看毛片| 91精品国产综合久久精品| 国产成人毛毛毛片| 亚洲国产精久久久久久| 黄色视屏网站在线免费观看| 中国人与牲禽动交精品| 黄色在线视频网站| 午夜精品一区二区三区在线视 | 丝袜国产日韩另类美女| 宅男噜噜噜66国产免费观看| 九色综合国产一区二区三区| 国产九九九视频| 972aa.com艺术欧美| 99精品全国免费观看| 亚洲精品免费电影| 欧美亚洲精品天堂| 欧美性猛交xxxx黑人交| 国产农村妇女毛片精品久久| 亚洲成人精品在线| 1024视频在线| 欧美日韩电影在线观看| 国产精品蜜芽在线观看| 国产精品日韩在线观看| 国产精品成人**免费视频| 国产亚洲二区| 97人人精品| 成人免费视频91| 蜜臀av一区二区在线免费观看| 性久久久久久久久久久久久久| 波多野结衣视频一区| 一级片久久久久| 亚洲综合久久久久| 久久这里只有精品9| 日韩午夜三级在线| 九色视频网站在线观看| 久久久精品亚洲| 国产高清不卡| 亚洲最大的免费| 蜜桃成人av| 国产精品三级一区二区| 三级一区在线视频先锋| 中国特级黄色片| 国产精品乱码一区二三区小蝌蚪| 久热这里只有精品在线| 欧美性猛交xxxx偷拍洗澡| 在线观看免费视频a| 精品99久久久久久| 久做在线视频免费观看| 国产精品美女视频网站| 久久夜色精品国产噜噜av小说| 性欧美18一19内谢| 久久资源在线| 精品人妻一区二区免费视频| 亚洲精品国产精华液| 亚洲精品国产无码| 精品视频偷偷看在线观看| 免费在线国产视频| 亚洲qvod图片区电影| 凹凸成人精品亚洲精品密奴| 毛片在线播放视频| 国产激情91久久精品导航| 俄罗斯毛片基地| 日本乱人伦一区| 水中色av综合| 91超碰caoporn97人人| 超碰成人福利| 91传媒免费视频| 久久97超碰国产精品超碰| 国产精品久久久久久久av| 在线观看国产一区二区| 青青草在线播放| 热草久综合在线| 日韩激情毛片| 国产主播在线看| 99天天综合性| 天海翼一区二区| 亚洲精品suv精品一区二区| 国产美女情趣调教h一区二区| 99超碰麻豆| 国产一区亚洲| 亚洲一二三四五| 亚洲国产欧美一区二区三区丁香婷| 亚洲爱爱综合网| 久久久久亚洲精品国产| y111111国产精品久久久| 国产av熟女一区二区三区 | 999视频在线免费观看| 五月激情久久久| www.欧美激情.com| 亚洲丝袜自拍清纯另类| 国产日本精品视频| 欧美成人精品激情在线观看| 一区二区三区四区精品视频| 精品人妻大屁股白浆无码| 国产69精品久久久久毛片| 国产无套内射又大又猛又粗又爽| 亚洲第一福利网站| 色老太综合网| 永久久久久久| 国产福利一区二区三区| 日本少妇激情视频| 亚洲久久久久久久久久| 99精品国自产在线| 日韩人妻精品一区二区三区| 国产精品123| 国产成人在线免费观看视频| 亚洲天堂久久av| 欧美成人xxxx| 欧美美女黄色网| 97久久精品人人做人人爽50路| 亚洲成人第一网站| 中文字幕日本精品| 国产aa精品| 国产精品久久中文字幕| 久久精品亚洲精品国产欧美kt∨| 瑟瑟视频在线免费观看| 超碰91人人草人人干| 欧美综合精品| 久久精品免费网站| 亚洲综合自拍偷拍| 欧美日本韩国一区二区| 国产色婷婷国产综合在线理论片a| 欧美欧美全黄| 91精彩刺激对白露脸偷拍| 8x福利精品第一导航| 国产在线精彩视频| 一区二区不卡在线观看| 成人免费毛片a| 中文字幕人妻精品一区| 久久久久久久香蕉网| 精品国产乱码久久久| 中文字幕55页| 91福利社在线观看| 美洲精品一卡2卡三卡4卡四卡| 日韩三级电影免费观看| 国产成人精品三级麻豆| 免费看污视频的网站| 欧美日本中文字幕| 成人精品视频| 精品一区二区视频在线观看| 欧美妇女性影城| 一区二区电影免费观看|