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

屏幕刷新機(jī)制 Choreographer 原理分析

移動(dòng)開發(fā) Android
Android平臺(tái)提供兩種信號(hào),一種是硬件信號(hào),另一種是軟件信號(hào),由SurfaceFlinger進(jìn)程的一個(gè)線程定時(shí)發(fā)出,硬件信號(hào)由硬件發(fā)出。

[[439195]]

本文轉(zhuǎn)載自微信公眾號(hào)「Android開發(fā)編程」,作者Android開發(fā)編程。轉(zhuǎn)載本文請(qǐng)聯(lián)系A(chǔ)ndroid開發(fā)編程公眾號(hào)。

前言

Android平臺(tái)提供兩種信號(hào),一種是硬件信號(hào),另一種是軟件信號(hào),由SurfaceFlinger進(jìn)程的一個(gè)線程定時(shí)發(fā)出,硬件信號(hào)由硬件發(fā)出;

App進(jìn)程若要通過gpu實(shí)現(xiàn)圖像繪制,需要在接收到Vsync信號(hào)的條件下進(jìn)行,因此,App進(jìn)程訪問SurfaceFlinger進(jìn)程獲取這個(gè)信號(hào),再進(jìn)行g(shù)pu繪制;

Android4.1之后增加了Choreographer機(jī)制,用于同Vsync機(jī)制配合,統(tǒng)一動(dòng)畫、輸入和繪制時(shí)機(jī);

Choreographer就是負(fù)責(zé)獲取Vsync同步信號(hào)并控制App線程(主線程)完成圖像繪制的類;

今天我們就來聊聊Choreographer機(jī)制;

一、Choreographer類介紹

1、實(shí)例初始化

  1. public ViewRootImpl(Context context, Display display) { 
  2.     ... 
  3.     //獲取Choreographer實(shí)例 
  4.     mChoreographer = Choreographer.getInstance(); 
  5.     ... 
  6. public static Choreographer getInstance() { 
  7.     return sThreadInstance.get(); 
  8. private static final ThreadLocal<Choreographer> sThreadInstance = 
  9.         new ThreadLocal<Choreographer>() { 
  10.     @Override 
  11.     protected Choreographer initialValue() { 
  12.         Looper looper = Looper.myLooper(); 
  13.         if (looper == null) { 
  14.             throw new IllegalStateException("The current thread must have a looper!"); 
  15.         } 
  16.         return new Choreographer(looper); 
  17.     } 
  18. }; 
  • 每個(gè)線程中保存一個(gè)Choreographer實(shí)例對(duì)象;
  • 線程本地存儲(chǔ)ThreadLocal變量,Choreographer類型,在主線程中初始化變量時(shí),創(chuàng)建Choreographer對(duì)象,綁定主線程Looper;
  • 同一個(gè)App的每個(gè)窗體旗下ViewRootImpl使用的同一個(gè)Choregrapher對(duì)象,他控制者整個(gè)App中大部分視圖的繪制節(jié)奏。

2、構(gòu)造方法

  1. private Choreographer(Looper looper, int vsyncSource) { 
  2.         mLooper = looper; 
  3.         //使用當(dāng)前線程looper創(chuàng)建 mHandler 
  4.         mHandler = new FrameHandler(looper); 
  5.         //USE_VSYNC 4.1以上默認(rèn)是true,表示 具備接受VSync的能力,這個(gè)接受能力就是FrameDisplayEventReceiver 
  6.         mDisplayEventReceiver = USE_VSYNC 
  7.                 ? new FrameDisplayEventReceiver(looper, vsyncSource) 
  8.                 : null
  9.         mLastFrameTimeNanos = Long.MIN_VALUE; 
  10.         // 計(jì)算一幀的時(shí)間,Android手機(jī)屏幕是60Hz的刷新頻率,就是16ms 
  11.         mFrameIntervalNanos = (long)(1000000000 / getRefreshRate()); 
  12.         // 創(chuàng)建一個(gè)鏈表類型CallbackQueue的數(shù)組,大小為5, 
  13.         //也就是數(shù)組中有五個(gè)鏈表,每個(gè)鏈表存相同類型的任務(wù):輸入、動(dòng)畫、遍歷繪制等任務(wù)(CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_TRAVERSAL) 
  14.         mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1]; 
  15.         for (int i = 0; i <= CALLBACK_LAST; i++) { 
  16.             mCallbackQueues[i] = new CallbackQueue(); 
  17.         } 
  18.         // b/68769804: For low FPS experiments. 
  19.         setFPSDivisor(SystemProperties.getInt(ThreadedRenderer.DEBUG_FPS_DIVISOR, 1)); 
  20.     } 
  • 有一個(gè)Looper和一個(gè)FrameHandler變量;
  • 變量USE_VSYNC用于表示系統(tǒng)是否是用了Vsync同步機(jī)制,該值是通過讀取系統(tǒng)屬性debug.choreographer.vsync來獲取的;
  • 系統(tǒng)使用了Vsync同步機(jī)制,創(chuàng)建一個(gè)FrameDisplayEventReceiver對(duì)象用于請(qǐng)求并接收Vsync事件;
  • Choreographer創(chuàng)建了一個(gè)大小為3的CallbackQueue隊(duì)列數(shù)組,用于保存不同類型的Callback。

3、Callback類型

  1. //輸入事件,首先執(zhí)行 
  2.     public static final int CALLBACK_INPUT = 0; 
  3.     //動(dòng)畫,第二執(zhí)行 
  4.     public static final int CALLBACK_ANIMATION = 1; 
  5.     //插入更新的動(dòng)畫,第三執(zhí)行 
  6.     public static final int CALLBACK_INSETS_ANIMATION = 2; 
  7.     //繪制,第四執(zhí)行 
  8.     public static final int CALLBACK_TRAVERSAL = 3; 
  9.     //提交,最后執(zhí)行, 
  10.     public static final int CALLBACK_COMMIT = 4; 

五種類型任務(wù)對(duì)應(yīng)存入對(duì)應(yīng)的CallbackQueue中;

每當(dāng)收到 VSYNC 信號(hào)時(shí),Choreographer 將首先處理 INPUT 類型的任務(wù),然后是 ANIMATION 類型,最后才是 TRAVERSAL 類型。

4、FrameHandler處理的消息

  • CallbackQueue是一個(gè)容量為4的數(shù)組,每一個(gè)元素作為頭指針,引出對(duì)應(yīng)類型的鏈表,4種事件就是通過這4個(gè)鏈表來維護(hù)的;
  • 而FrameHandler中主要處理三類消息:
  1. private final class FrameHandler extends Handler { 
  2.    public FrameHandler(Looper looper) { 
  3.        super(looper); 
  4.    } 
  5.    @Override 
  6.    public void handleMessage(Message msg) { 
  7.        switch (msg.what) { 
  8.            case MSG_DO_FRAME: 
  9.                doFrame(System.nanoTime(), 0); 
  10.                break; 
  11.            case MSG_DO_SCHEDULE_VSYNC: 
  12.                doScheduleVsync();   // 請(qǐng)求VSYNC信號(hào) 
  13.                break; 
  14.            case MSG_DO_SCHEDULE_CALLBACK: 
  15.                doScheduleCallback(msg.arg1); 
  16.                break; 
  17.        } 
  18.    } 
  • MSG_DO_FRAME 處理注冊(cè)在Choreographer 的Runnable;
  • MSG_DO_SCHEDULE_VSYNC 直接請(qǐng)求下一幀的VSync信號(hào);
  • MSG_DO_SCHEDULE_CALLBACK 根據(jù)Choreographer的配置執(zhí)行合適的Handler延時(shí)處理;

二、Choreographer執(zhí)行流程

1、requestLayout

  1. @Override 
  2.     public void requestLayout() { 
  3.         if (!mHandlingLayoutInLayoutRequest) { 
  4.             checkThread();//檢查是否在當(dāng)前線程 
  5.             mLayoutRequested = true;//mLayoutRequested 是否measure和layout布局。 
  6.             scheduleTraversals(); 
  7.         } 
  8.     } 
  9.     void scheduleTraversals() { 
  10.         if (!mTraversalScheduled) {//同一幀內(nèi)不會(huì)多次調(diào)用遍歷 
  11.             mTraversalScheduled = true
  12.             mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();//攔截同步Message 
  13.             //Choreographer回調(diào),執(zhí)行繪制操作 
  14.             mChoreographer.postCallback( 
  15.                     Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); 
  16.         } 
  17.     } 
  • postSyncBarrier : Handler 的同步屏障,它的作用是可以攔截 Looper 對(duì)同步消息的獲取和分發(fā),加入同步屏障之后,Looper 只會(huì)獲取和處理異步消息,如果沒有異步消息那么就會(huì)進(jìn)入阻塞狀態(tài);
  • Choreographer: 編舞者,統(tǒng)一動(dòng)畫、輸入和繪制時(shí)機(jī);
  1. mChoreographer.postCallback( 
  2.                     Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); 
  3. postCallback()->postCallbackDelayed()->postCallbackDelayedInternal(): 

2、postCallbackDelayedInternal

  1. private void postCallbackDelayedInternal(int callbackType, 
  2.        Object action, Object token, long delayMillis) { 
  3.    synchronized (mLock) { 
  4.        // 當(dāng)前時(shí)間 
  5.        final long now = SystemClock.uptimeMillis(); 
  6.        // 回調(diào)執(zhí)行時(shí)間,為當(dāng)前時(shí)間加上延遲的時(shí)間 
  7.        final long dueTime = now + delayMillis; 
  8.        // obtainCallbackLocked(long dueTime, Object action, Object token)會(huì)將傳入的3個(gè)參數(shù)轉(zhuǎn)換為CallbackRecord(具體請(qǐng)看源碼,非主要部分,此處略過),然后CallbackQueue根據(jù)回調(diào)類型將CallbackRecord添加到鏈表上。 
  9.        mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token); 
  10.        if (dueTime <= now) { 
  11.            // 如果delayMillis=0的話,dueTime=now,則會(huì)馬上執(zhí)行 
  12.            scheduleFrameLocked(now); 
  13.        } else { 
  14.            // 如果dueTime>now,則發(fā)送一個(gè)what為MSG_DO_SCHEDULE_CALLBACK類型的定時(shí)消息,等時(shí)間到了再處理,其最終處理也是執(zhí)行scheduleFrameLocked(long now)方法 
  15.            Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_CALLBACK, action); 
  16.            msg.arg1 = callbackType; 
  17.            msg.setAsynchronous(true); 
  18.            mHandler.sendMessageAtTime(msg, dueTime); 
  19.        } 
  20.    } 
  • mCallbackQueues先把對(duì)應(yīng)的callback添加到鏈表上來,然后判斷是否有延遲;
  • 如果沒有則會(huì)馬上執(zhí)行scheduleFrameLocked,如果有,則發(fā)送一個(gè)what為MSG_DO_SCHEDULE_CALLBACK類型的定時(shí)消息,等時(shí)間到了再處理;
  • 其最終處理也是執(zhí)行scheduleFrameLocked(long now)方法;

3、scheduleFrameLocked

  1. private void scheduleFrameLocked(long now) { 
  2.    if (!mFrameScheduled) { 
  3.        mFrameScheduled = true
  4.        if (USE_VSYNC) { 
  5.            // 如果使用了VSYNC,由系統(tǒng)值確定 
  6.            if (DEBUG_FRAMES) { 
  7.                Log.d(TAG, "Scheduling next frame on vsync."); 
  8.            } 
  9.            if (isRunningOnLooperThreadLocked()) { 
  10.                // 請(qǐng)求VSYNC信號(hào),最終會(huì)調(diào)到Native層,Native處理完成后觸發(fā)FrameDisplayEventReceiver的onVsync回調(diào),回調(diào)中最后也會(huì)調(diào)用doFrame(long frameTimeNanos, int frame)方法 
  11.                scheduleVsyncLocked(); 
  12.            } else { 
  13.                // 在UI線程上直接發(fā)送一個(gè)what=MSG_DO_SCHEDULE_VSYNC的消息,最終也會(huì)調(diào)到scheduleVsyncLocked()去請(qǐng)求VSYNC信號(hào) 
  14.                Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_VSYNC); 
  15.                msg.setAsynchronous(true); 
  16.                mHandler.sendMessageAtFrontOfQueue(msg); 
  17.            } 
  18.        } else { 
  19.            // 沒有使用VSYNC 
  20.            final long nextFrameTime = Math.max
  21.                    mLastFrameTimeNanos / TimeUtils.NANOS_PER_MS + sFrameDelay, now); 
  22.            if (DEBUG_FRAMES) { 
  23.                Log.d(TAG, "Scheduling next frame in " + (nextFrameTime - now) + " ms."); 
  24.            } 
  25.            // 直接發(fā)送一個(gè)what=MSG_DO_FRAME的消息,消息處理時(shí)調(diào)用doFrame(long frameTimeNanos, int frame)方法 
  26.            Message msg = mHandler.obtainMessage(MSG_DO_FRAME); 
  27.            msg.setAsynchronous(true); 
  28.            mHandler.sendMessageAtTime(msg, nextFrameTime); 
  29.        } 
  30.    } 
  1. // Enable/disable vsync for animations and drawing. 
  2.     private static final boolean USE_VSYNC = SystemProperties.getBoolean( 
  3.             "debug.choreographer.vsync"true); 

常量USE_VSYNC,表示是否允許動(dòng)畫和繪制的垂直同步,默認(rèn)是為true;

判斷USE_VSYNC,如果使用了VSYNC:走scheduleVsyncLocked,即請(qǐng)求VSYNC信號(hào),最終調(diào)用doFrame;

如果沒使用VSYNC,則通過消息執(zhí)行doFrame;

4、scheduleVsyncLocked

請(qǐng)求VSYNC信號(hào)的流程;

  1. private void scheduleVsyncLocked() { 
  2.     mDisplayEventReceiver.scheduleVsync(); 
  3. public void scheduleVsync() { 
  4.     if (mReceiverPtr == 0) { 
  5.         Log.w(TAG, "Attempted to schedule a vertical sync pulse but the display event " 
  6.                 + "receiver has already been disposed."); 
  7.     } else { 
  8.         nativeScheduleVsync(mReceiverPtr); 
  9.     } 
  • mDisplayEventReceiver 對(duì)應(yīng)的是FrameDisplayEventReceiver,它繼承自 DisplayEventReceiver , 主要是用來接收同步脈沖信號(hào) VSYNC;
  • scheduleVsync()方法通過底層nativeScheduleVsync()向SurfaceFlinger 服務(wù)注冊(cè),即在下一次脈沖接收后會(huì)調(diào)用 DisplayEventReceiver的dispatchVsync()方法;
  • 這里類似于訂閱者模式,但是每次調(diào)用nativeScheduleVsync()方法都有且只有一次dispatchVsync()方法回調(diào);
  • 底層向應(yīng)用層發(fā)送VSYNC信號(hào),java層通過dispatchVsync()接收,最后回調(diào)在FrameDisplayEventReceiver的onVsync;

5、FrameDisplayEventReceiver

  1. private final class FrameDisplayEventReceiver extends DisplayEventReceiver implements Runnable { 
  2.     private boolean mHavePendingVsync; 
  3.     private long mTimestampNanos; 
  4.     private int mFrame; 
  5.     @Override 
  6.     public void onVsync(long timestampNanos, int builtInDisplayId, int frame) { 
  7.         //忽略來自第二顯示屏的Vsync 
  8.         if (builtInDisplayId != SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN) { 
  9.             scheduleVsync(); 
  10.             return
  11.         } 
  12.         ... 
  13.         mTimestampNanos = timestampNanos; 
  14.         mFrame = frame; 
  15.         //該消息的callback為當(dāng)前對(duì)象FrameDisplayEventReceiver 
  16.         Message msg = Message.obtain(mHandler, this); 
  17.         msg.setAsynchronous(true); 
  18.         //此處mHandler為FrameHandler 
  19.         mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS); 
  20.     } 
  21.     @Override 
  22.     public void run() { 
  23.         mHavePendingVsync = false
  24.         doFrame(mTimestampNanos, mFrame);  
  25.     } 
  • onVsync()過程是通過FrameHandler向主線程Looper發(fā)送了一個(gè)自帶callback的消息 callback為FrameDisplayEventReceiver;
  • 當(dāng)主線程Looper執(zhí)行到該消息時(shí),則調(diào)用FrameDisplayEventReceiver.run()方法,緊接著便是調(diào)用doFrame;

6、doFrame

  1. void doFrame(long frameTimeNanos, int frame) { 
  2.         final long startNanos; 
  3.         synchronized (mLock) { 
  4.             ... 
  5.             //是否有跳幀,如果有那么就打印log并且修正偏差 
  6.         } 
  7.         //執(zhí)行callback 
  8.         try { 
  9.             Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame"); 
  10.             AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS); 
  11.             mFrameInfo.markInputHandlingStart(); 
  12.             doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); 
  13.             mFrameInfo.markAnimationsStart(); 
  14.             doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos); 
  15.             mFrameInfo.markPerformTraversalsStart(); 
  16.             doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); 
  17.             doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); 
  18.         } finally { 
  19.             AnimationUtils.unlockAnimationClock(); 
  20.             Trace.traceEnd(Trace.TRACE_TAG_VIEW); 
  21.         } 
  22.         if (DEBUG_FRAMES) { 
  23.             final long endNanos = System.nanoTime(); 
  24.             Log.d(TAG, "Frame " + frame + ": Finished, took " 
  25.                     + (endNanos - startNanos) * 0.000001f + " ms, latency " 
  26.                     + (startNanos - frameTimeNanos) * 0.000001f + " ms."); 
  27.         } 
  28.     } 

doFrame方法做的就是渲染下一幀,檢測(cè)是否卡頓并修補(bǔ)卡頓,然后開始做渲染工作,doCallbacks方法的參數(shù):

  • CALLBACK_INPUT:輸入;
  • CALLBACK_ANIMATION:動(dòng)畫;
  • CALLBACK_TRAVERSAL:遍歷,執(zhí)行measure、layout、draw;
  • CALLBACK_COMMIT:遍歷完成的提交操作,用來修正動(dòng)畫啟動(dòng)時(shí)間;

7、doCallbacks

  1. void doCallbacks(int callbackType, long frameTimeNanos) { 
  2.     CallbackRecord callbacks; 
  3.     synchronized (mLock) { 
  4.         final long now = SystemClock.uptimeMillis(); 
  5.         //從指定類型的CallbackQueue隊(duì)列中查找執(zhí)行時(shí)間到的CallbackRecord 
  6.         callbacks = mCallbackQueues[callbackType].extractDueCallbacksLocked(now); 
  7.         if (callbacks == null) { 
  8.             return
  9.         } 
  10.         mCallbacksRunning = true
  11.     } 
  12.     try { 
  13.         //由于CallbackQueues是按時(shí)間先后順序排序的,因此遍歷執(zhí)行所有時(shí)間到的CallbackRecord 
  14.         for (CallbackRecord c = callbacks; c != null; c = c.next) { 
  15.             c.run(frameTimeNanos); 
  16.         } 
  17.     } finally { 
  18.         synchronized (mLock) { 
  19.             mCallbacksRunning = false
  20.             do { 
  21.                 final CallbackRecord next = callbacks.next
  22.                 recycleCallbackLocked(callbacks); 
  23.                 callbacks = next
  24.             } while (callbacks != null); 
  25.         } 
  26.     } 

Choreographer內(nèi)部維護(hù)了這四種鏈表,渲染每一幀的時(shí)候都會(huì)從上往下的去執(zhí)行相應(yīng)的渲染操作,有輸入那么就先渲染輸入隊(duì)列,有動(dòng)畫就渲染動(dòng)畫,然后遍歷,然后提交;

8、Choreographer總結(jié)

  • 控制外部輸入事件處理,動(dòng)畫執(zhí)行,UI變化,以及提交執(zhí)行都是在同一個(gè)類中做的處理,即是Choreographer;
  • Choreographer支持4種類型事件:輸入、繪制、動(dòng)畫、提交,并通過postCallback在對(duì)應(yīng)需要同步vsync進(jìn)行刷新處進(jìn)行注冊(cè),等待回調(diào);
  • 每次執(zhí)行的時(shí)候,Choreographer會(huì)根據(jù)當(dāng)前的時(shí)間,只處理事件鏈表中最后一個(gè)事件,當(dāng)有耗時(shí)操作在主線程時(shí),事件不能及時(shí)執(zhí)行,就會(huì)出現(xiàn)所謂的“跳幀”,“卡頓”現(xiàn)象;
  • Choreographer的共有方法postCallback(callbackType, Object)是往事件鏈表中放事件的方法,而doFrame()是消耗這些事件的方法;
  • Choreographer監(jiān)聽底層Vsync信號(hào),一旦接收到回調(diào)信號(hào),則通過doFrame統(tǒng)一對(duì)java層4種類型事件進(jìn)行回調(diào)。

 

責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2011-07-15 09:57:03

MongoDB緩存刷新

2021-04-21 07:53:13

Android屏幕刷新

2025-08-06 07:47:22

2020-10-13 08:36:30

React 架構(gòu)機(jī)制

2020-09-21 14:35:20

VuenextTick前端

2025-05-07 08:00:00

刷新令牌自動(dòng)續(xù)簽FastAPI

2010-09-06 08:43:13

.NET 4

2010-03-10 11:55:30

Mocha BSM運(yùn)維管理摩卡軟件

2010-06-02 11:33:26

Linux 內(nèi)存監(jiān)控

2024-01-03 21:50:32

緩存機(jī)制請(qǐng)求

2016-10-21 09:29:53

嵌入式Linux更新機(jī)制

2012-12-03 16:57:37

HDFS

2022-11-02 15:56:45

littlefscommit機(jī)制

2021-02-25 11:12:31

人工智能生物技術(shù)肺纖維化藥物

2025-04-03 00:45:00

2018-08-10 04:40:56

2024-06-17 08:55:52

2021-12-06 14:52:08

動(dòng)畫Android補(bǔ)間動(dòng)畫

2009-11-13 17:20:35

ADO.NET數(shù)據(jù)集工

2011-05-05 17:13:25

故障筆記本
點(diǎn)贊
收藏

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

精品高清美女精品国产区| 香蕉精品999视频一区二区| 欧美日韩高清一区二区三区| 中文字幕第50页| 人妻一区二区三区免费| 日韩av电影天堂| 欧美巨猛xxxx猛交黑人97人| 国产老熟女伦老熟妇露脸| 国模一区二区| 一区二区三区精品视频在线| 久久综合九色99| 国产喷水吹潮视频www| 99视频精品免费观看| 中文字幕精品在线| 岛国精品一区二区三区| 日韩欧美精品电影| 亚洲国产色一区| 亚洲欧洲精品一区| 亚洲欧美综合在线观看| 国产一区视频导航| 国产成人综合精品在线| 日本三级免费看| 91精品国产91久久久久久密臀 | 欧美大片在线播放| av影片在线看| 97se亚洲国产综合自在线不卡| 国产欧美日韩高清| 人妻 日韩精品 中文字幕| 中文字幕一区二区三三| 在线视频一区二区| 日本黄色特级片| 91精品国产乱码久久久竹菊| 欧美日韩亚洲综合| 在线精品播放av| 色乱码一区二区三区在线| 欧美激情护士| 亚洲最新视频在线观看| 一级做a爰片久久| 国产中文字幕在线看| 99久久777色| 不卡视频一区| 国产免费视频一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 2019中文在线观看| 日韩av一二三区| 欧美视频成人| 九九九久久久久久| 久久精品黄色片| 亚洲欧美在线专区| 久久精品一偷一偷国产| 波多野吉衣中文字幕| 日韩三级毛片| 日韩av在线直播| 性欧美丰满熟妇xxxx性久久久| 亚洲一级大片| 欧美电影精品一区二区| 男人添女人荫蒂国产| 51vv免费精品视频一区二区| 欧美一级夜夜爽| 久草福利在线观看| 2023国产精华国产精品| 亚洲福利在线看| 亚洲精品中文字幕在线播放| 三级精品视频| 亚洲深夜福利视频| 亚洲人成人无码网www国产| 精品久久不卡| 日韩在线观看av| 最新一区二区三区| 午夜日韩电影| 国内精品伊人久久| 91video| 日本视频免费一区| 国产精品爽爽爽| 国产色综合视频| 国产69精品一区二区亚洲孕妇| 国产成人亚洲欧美| 欧美日韩伦理片| 国产拍欧美日韩视频二区| 亚洲精品久久区二区三区蜜桃臀| 人人干在线视频| 亚洲天堂av一区| 99在线免费视频观看| 大菠萝精品导航| 欧日韩精品视频| 激情久久综合网| 9l视频自拍九色9l视频成人| 日韩国产一区三区| 中文字幕第二区| 欧美日韩国产综合网| 欧美做受高潮电影o| 伊人色综合久久久| 国产aⅴ综合色| 欧美精品一区在线| 久cao在线| 精品免费在线观看| 91福利免费观看| 人妖一区二区三区| 久久精品成人一区二区三区| 日本五十路女优| 久久99精品国产麻豆婷婷洗澡| 99re资源| 国产精品四虎| 性做久久久久久免费观看 | 亚洲天堂精品在线| 欧美日韩中文字幕日韩欧美| 黄色一级片播放| 成人午夜毛片| 精品国产污网站| 日韩视频在线观看免费视频| 欧美另类视频| 国产精品久久久久av免费| 精品人妻伦一区二区三区久久| 91视视频在线观看入口直接观看www | 激情五月色婷婷| 国产在线精品一区在线观看麻豆| 久久精品美女| 午夜伦理在线视频| 欧美日韩美少妇| 亚洲国产精品自拍视频| 综合一区二区三区| 国产精品久久久久久中文字| av手机免费看| 国产精品视频观看| 亚洲成av人综合在线观看| 精品国产一区二区三区四区精华| 日本激情视频在线观看| 色综合一区二区| 黄色av电影网站| 欧美成人自拍| 国产精品极品在线| 日本免费一区二区三区最新| 一区二区久久久| 亚洲欧美日韩三级| 精品无人区麻豆乱码久久久| 欧美怡春院一区二区三区| 欧美一级特黄aaaaaa| 亚洲综合一区二区| 一个人看的视频www| 99成人在线视频| 国产精品偷伦免费视频观看的| 亚洲欧美日韩精品永久在线| 亚洲国产欧美在线人成| av电影中文字幕| 欧美淫片网站| 99久久99| 欧美大胆的人体xxxx| 日韩视频一区在线观看| 天天看天天摸天天操| 精品一区二区av| 一区二区三视频| av日韩在线免费观看| 久久精品国产亚洲| 国产日产亚洲系列最新| 亚洲三级电影网站| 少妇性l交大片7724com| 欧美在线影院| 国产99视频精品免费视频36| 国产精品偷拍| 日韩av网站在线| 国产剧情在线视频| 国产拍欧美日韩视频二区 | 麻豆精品一区二区av白丝在线| 欧洲精品久久| 久久亚洲精品人成综合网| 日韩中文字幕在线| 国产成人av免费看| 亚洲午夜羞羞片| 久久精品一区二区免费播放| 久久久久中文| 一区二区精品在线| 免费看日产一区二区三区| 久久久免费av| 你懂的免费在线观看| 色诱亚洲精品久久久久久| 国产一区欧美二区三区| 亚洲熟女少妇一区二区| 国产福利91精品一区二区三区| 91.com在线| 亚洲日产av中文字幕| 国产精品爽爽爽| 欧美v亚洲v| 亚洲免费高清视频| 国产精品无码天天爽视频| 亚洲在线观看免费| 最近中文字幕在线mv视频在线| 看片网站欧美日韩| 激情六月天婷婷| 亚洲a级精品| 成人免费福利在线| 538在线精品| 一区二区三区回区在观看免费视频| 国产精品无码免费播放| 狠狠久久五月精品中文字幕| 四虎影视一区二区| 99视频精品在线| 欧美日韩中文不卡| 亚洲美女毛片| 亚洲资源视频| 日本欧美高清| 91色中文字幕| 欧美极品免费| 色综合久久悠悠| 成人综合影院| 日韩成人性视频| 99re只有精品| 欧美在线高清视频| 日韩视频免费观看高清| 亚洲欧洲色图综合| 无码熟妇人妻av| 成人丝袜视频网| 91亚洲免费视频| 国产亚洲精品久久久久婷婷瑜伽| av动漫免费观看| 欧美欧美黄在线二区| 91视频最新| 亚洲国产伊人| 国产精品久久久久久久电影| 国产资源在线观看入口av| 精品激情国产视频| yjizz视频网站在线播放| 亚洲精品国精品久久99热一| www.蜜臀av.com| 欧美精品tushy高清| 日韩欧美成人一区二区三区| 亚洲自拍另类综合| 天天天天天天天天操| 国产精品久久久久婷婷| 色无极影院亚洲| 91毛片在线观看| 成人免费看片载| 免费观看成年人视频| 午夜精品福利久久久| h色网站在线观看| 中文字幕在线播放不卡一区| www.av欧美| 91视频在线看| 中国黄色a级片| 91视频一区二区三区| 国产精品久久久久久亚洲色| 高清shemale亚洲人妖| 国产xxxxhd| 国产乱子伦一区二区三区国色天香| 五月婷婷六月合| 麻豆精品精品国产自在97香蕉| 无码人妻精品一区二区三区66| 久久激情视频| 99蜜桃臀久久久欧美精品网站| 欧美一区=区| 久久精品99国产| 久久精品一区| 国产裸体免费无遮挡| 日韩av不卡一区二区| 黄色国产小视频| 久久成人免费网| 992kp免费看片| 国产精品主播直播| 人妻激情偷乱频一区二区三区| 成人av在线网站| 在线观看国产三级| 国产夜色精品一区二区av| 在哪里可以看毛片| 国产精品久久久一本精品 | 黄色一级片免费播放| 国产99精品在线观看| 日本国产在线视频| 久久亚洲一级片| jizzjizz日本少妇| 一区二区三区在线免费播放| 日本三级片在线观看| 在线观看av一区| 国产视频在线观看视频| 亚洲成人网在线观看| 黄色大片在线看| 久久精品人人做人人爽| 任你弄在线视频免费观看| 97香蕉久久夜色精品国产| 视频精品导航| 99re国产在线播放| 中文字幕中文字幕精品| 亚洲综合激情五月| 免费日韩av| 欧美激情第一区| 久久综合九色欧美综合狠狠 | 亚洲成人av福利| 奴色虐av一区二区三区| 欧美一级夜夜爽| 九色在线视频| 欧美黑人性视频| 日本中文字幕一区二区| 在线视频国内自拍亚洲视频| 人妻 丝袜美腿 中文字幕| 久久男人中文字幕资源站| 欧洲美女女同性互添| 亚洲r级在线视频| 中文字幕乱码视频| 日韩欧美aaaaaa| www免费网站在线观看| 另类视频在线观看| 国产精欧美一区二区三区蓝颜男同| 国产精品久久久久影院日本| 国产精品自在| 亚洲欧美日产图| 欧美私人啪啪vps| 亚洲36d大奶网| 波多野结衣中文字幕一区二区三区| 久久久久久久久久久久国产精品| 亚洲国产成人自拍| 国产一级二级三级视频| 欧美猛男gaygay网站| 天天干,夜夜操| yellow中文字幕久久| 日韩免费va| 精品在线一区| 99久久精品费精品国产风间由美| 欧美视频免费播放| 国产一区二区三区久久悠悠色av| 白白色免费视频| 亚洲午夜精品17c| 国产一区二区网站| 在线精品国产欧美| 麻豆mv在线观看| 国产视频一区二区三区四区| 图片小说视频色综合| 欧美xxxxx在线视频| 懂色av一区二区夜夜嗨| 国产精品18在线| 黄网动漫久久久| 国产91久久久| 久久亚洲精品网站| 99亚洲男女激情在线观看| 日韩av高清| 在线视频日韩| 三叶草欧洲码在线| 亚洲国产三级在线| 欧美一区二区在线观看视频| 久久国产精品久久国产精品| 深夜视频一区二区| 欧美一区二区三区四区在线观看地址| 国产综合亚洲精品一区二| 国产成人精品一区二区三区在线观看| 国产精品美女久久久久高潮| 久久久久精彩视频| 在线精品播放av| 国产一区二区主播在线| 亚洲精品电影在线一区| 秋霞午夜鲁丝一区二区老狼| 大尺度在线观看| 五月天网站亚洲| 免费av一级片| 久久久国产一区二区三区| 久久久久国产精品www| 日韩三级一区| 视频一区二区三区在线观看| 日本在线不卡视频| 欧美一区二区三区啪啪| 国产在线观看免费网站| 国产成人av在线播放| 要久久电视剧全集免费| 99草草国产熟女视频在线| 久久亚洲精精品中文字幕早川悠里 | 日韩在线卡一卡二| 亚洲国产第一区| 大荫蒂欧美视频另类xxxx| 午夜av免费在线观看| 国产xxx69麻豆国语对白| 要久久爱电视剧全集完整观看| 欧美精品久久久久久久久25p| 亚洲国产精品ⅴa在线观看| 亚洲一二区视频| 色综合久久88| 日韩成人动漫在线观看| 国产一区二区在线免费播放| 国产精品国产三级国产专播品爱网 | 无码精品黑人一区二区三区 | h1515四虎成人| 中文字幕色一区二区| 成人h版在线观看| 少妇高潮av久久久久久| 久久偷看各类女兵18女厕嘘嘘| 精品国产一级| 午夜免费福利小电影| 国产日韩三级在线| 国产视频www| 日本久久久a级免费| 日韩欧美高清| 亚洲一区二区在线免费| 欧美在线综合视频| 好操啊在线观看免费视频| 精品视频一区二区| 久久三级福利| 青青草激情视频| 日韩av在线资源| 国产一区二区三区精品在线观看| 无码 制服 丝袜 国产 另类| 国产jizzjizz一区二区| 中文字幕一区二区三区波野结| 欧美老少做受xxxx高潮| jvid福利在线一区二区| 巨乳女教师的诱惑|