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

React Native中ScrollView性能探究

移動開發(fā) Android
ScrollView 是 React Native(后面簡稱:RN) 中最常見的組件之一。理解 ScrollView 的原理,有利于寫出高性能的 RN 應(yīng)用。

1 基本使用

ScrollView 是 React Native(后面簡稱:RN) 中最常見的組件之一。理解 ScrollView 的原理,有利于寫出高性能的 RN 應(yīng)用。

ScrollView 的基本使用也非常簡單,如下:

  1. <ScrollView>   
  2.   <Child1 /> 
  3.   <Child2 /> 
  4.   ... 
  5. </ScrollView>  

它和 View 組件一樣,可以包含一個或者多個子組件。對子組件的布局可以是垂直或者水平的,通過屬性 horizontal=true/false 來控制。甚至還默認支持“下拉”刷新操作。另外還有一個特別贊的特性,超出屏幕的 View 會自動被移除,從而節(jié)省資源和提高繪制效率。我們來看如下一個例子:

  1. class ScrollViewTest extends Component { 
  2.   
  3.   render() { 
  4.     let children = []; 
  5.   
  6.     for (var i = 0; i < 20; i++) { 
  7.       children.push( 
  8.         <View key={"key_" + i} style={styles.child}> 
  9.           <Text>{"T" + i}</Text> 
  10.         </View>); 
  11.     } 
  12.     return ( 
  13.         <ScrollView style={styles.scrollView}> 
  14.           {children} 
  15.         </ScrollView> 
  16.     ); 
  17.   } 
  18.  

在 Android 上的效果如下: 

 

 

 

如圖,我們在 ScrollView 中添加了 20 個子組件,但是我們的屏幕任意時刻最多只能顯示 5 個子項目。

下面我們來看實際對應(yīng)的 Native 控件的情況。RN 中的 ScrollView 對應(yīng)到 Native 的 RCTScrollView,自動把子組件包含在一個 ViewGroup 中(因為Android 的 ScrollView 只能有一個直接子控件),如下圖中的紅色框內(nèi): 

 

 

 

注意到,我們在 JS 中添加了 20 個子組件,但是在 RCTViewGroup 中只有在屏幕上顯示的 5 個子控件,在屏幕外的組件,也會自動添加到 View 樹中,這與 Native 的 ScrollView 表現(xiàn)一致。

其實,RN 中的 ScrollView 有一個 removeClippedSubviews 屬性,表示如果子 View 超出可視區(qū)域,是否自動移除,雖然默認是 true。但是也需要子 View 的 overflow: 'hidden'屬性配合。所以,給子組件的 style 添加如下屬性即可。

  1. <View key={"key_" + i} style={styles.child}>   
  2.   <Text>{"T" + i}</Text> 
  3. </View>; 
  4.   
  5. const styles = StyleSheet.create({   
  6.   child: { 
  7.     ... 
  8.     overflow: 'hidden'
  9.   }, 
  10. });  

得到的效果是,在使用上完全沒有區(qū)別,而我們來看一下界面的 Tree View,如下圖: 

 

 

 

可見,屏幕外的子 View,就被自動從 View 樹中移除了。

同時,我們來看一下 iOS 平臺上的表現(xiàn),與 Android 上類似: 

 

 

這印證了我們前面的結(jié)論,RN 自動優(yōu)化了 Native 平臺 ScrollView,在這個層面,我們可以說 RN 比 Native 的性能還要高。

2 性能研究

通過上面的實例,我們可以看到,ScrollView 應(yīng)該是非常高效的,它使用簡單,并且還能按需構(gòu)建 View 樹,高效渲染,有點類似 Native 平臺上的 ListView 了,是我心目完美 ScrollView 該有的樣子。

但是,之前看到騰訊的 TAT.ronnie 一篇文章 探索 react native 首屏渲染最佳實踐,文中提到的優(yōu)化方法,主要就是針對 ScrollView 的。作者認為,在 ScrollView 中,即使不可見(例如,超出屏幕)的組件還是會繪制的。為了優(yōu)化 ScrollView 的繪制性能,不可見的組件,應(yīng)該在 JS 中避免添加到 ScrollView 中。

顯然,這與我們前面觀察到的結(jié)論是矛盾的。但是,作者的通過那樣處理,確實優(yōu)化了顯示性能,這是怎么回事呢?為了驗證,我們也和文中一樣,使用 componentDidMount() 和 componentWillMount() 的時間差衡量顯示速度。在 Android 上,測試 ScrollView 的子組件數(shù)量分別為 10,100,1000 的時候,顯示的時間,以及 APP 所占用的內(nèi)存:

子組件數(shù)量 加載時間(ms) 占用內(nèi)存(MB) 繪制時間*(ms)
10 309 19.7 14.666
100 1170 21.9 15.016
1000 9461 26.5 15.025

* 注,這里的繪制時間,是在 Tree View 中獲得的 Draw 時間。

從加載時間看,時間隨著子組件的數(shù)量線性增加,占用內(nèi)存也有類似趨勢,說明 TAT.ronnie 的改進方法確實是有效的。另外我們也注意到,隨著子組件的數(shù)量增加,Draw 的時間并沒有明顯的變化,其實 Measure 和 Layout 時間也沒有明顯的變化。

說明 ScrollView 雖然有 removeClippedSubviews 屬性,也確實在 View Hierarchy 中去掉了不可見的 View。但是組件的加載時間消耗資源還是隨著子組件的數(shù)量成正比。

3 原因分析

來看一下 RN 中 ScrollView 的相關(guān)的源碼,主要分析 Android 平臺的代碼,iOS 類似,就不贅述了。

  1. // ScrollView.js 
  2. var AndroidScrollView = requireNativeComponent('RCTScrollView', ScrollView, nativeOnlyProps);   
  3. var AndroidHorizontalScrollView = requireNativeComponent(   
  4.   'AndroidHorizontalScrollView'
  5.   ScrollView, 
  6.   nativeOnlyProps 
  7. ); 
  8.   
  9. var ScrollView = React.createClass({   
  10.   render: function() { 
  11.     var contentContainer = 
  12.        <View 
  13.          ... 
  14.          removeClippedSubviews={this.props.removeClippedSubviews} 
  15.          collapsable={false}> 
  16.          {this.props.children} 
  17.        </View>; 
  18.   
  19.      var ScrollViewClass; 
  20.      if (Platform.OS === 'ios') { 
  21.        ... 
  22.      } else if (Platform.OS === 'android') { 
  23.        if (this.props.horizontal) { 
  24.          ScrollViewClass = AndroidHorizontalScrollView; 
  25.        } else { 
  26.          ScrollViewClass = AndroidScrollView; 
  27.        } 
  28.      } 
  29.   
  30.      // 為了簡單,忽略有下拉刷新的情況 
  31.      return ( 
  32.       <ScrollViewClass ...> 
  33.         {contentContainer} 
  34.       </ScrollViewClass> 
  35.     ); 
  36.   } 
  37. });  

JS 部分的代碼邏輯很簡單。首先把 ScrollView 所有子組件包裝在一個 View contentContainer 中,并繼承設(shè)置了 removeClippedSubviews 屬性。根據(jù) ScrollView 是否是水平方向,決定是用 RCTScrollView 或者 AndroidHorizontalScrollView Native 組件來包含 contentContainer。

所以,我們先來看 RCTScrollView 本地組件對應(yīng)的代碼(AndroidHorizontalScrollView 原理也類似)。JS 中的 RCTScrollView 組件由 com.facebook.react.views.scroll.ReactScrollViewManager 提供,具體的 View 的實現(xiàn)是 com.facebook.react.views.scroll.ReactScrollView。

其中 ReactScrollViewManager 是最基礎(chǔ)的 ViewManager 的實現(xiàn),導出了一些屬性和事件。ReactScrollView 則繼承于 android.widget.ScrollView,并實現(xiàn)了 ReactClippingViewGroup 接口。關(guān)于 Scroll 事件相關(guān)的代碼我們先忽略,我主要關(guān)心 View 繪制相關(guān)的代碼。主要在下面這段代碼:

  1. @Override 
  2. public void updateClippingRect() {   
  3.   if (!mRemoveClippedSubviews) { 
  4.     return
  5.   } 
  6.   ... 
  7.   View contentView = getChildAt(0); 
  8.   if (contentView instanceof ReactClippingViewGroup) { 
  9.     ((ReactClippingViewGroup) contentView).updateClippingRect(); 
  10.   } 
  11.  

可見,如果不開啟 mRemoveClippedSubviews,它就和普通的 ScrollView 一樣,否者,它就會調(diào)用了它的第一個(也是唯一的一個)子 View 的 updateClippingRect() 方法。從上面的 JS 中我們可以看到,它的第一個子元素應(yīng)該就是一個 View 組件,對應(yīng)的 Native 的控件就是 ReactViewGroup。 ReactViewGroup 是 RN for Android 中最基礎(chǔ)的控件,它直接繼承于 android.view.ViewGroup:

  1. public class ReactViewGroup extends ViewGroup implements   
  2.     ReactInterceptingViewGroup, ReactClippingViewGroup, ReactPointerEventsView, ReactHitSlopView { 
  3.   private boolean mRemoveClippedSubviews = false
  4.   // 用來保存所有子 View 的數(shù)組,包括可見和不可見的 
  5.   private @Nullable View[] mAllChildren = null
  6.   private int mAllChildrenCount; 
  7.   // 當前 ReactViewGroup 于父 View 相交矩陣, 
  8.   // 也就是它自己在父 View 中可見區(qū)域 
  9.   private @Nullable Rect mClippingRect; 
  10.   ... 
  11.  

在 ReactViewGroup 中實現(xiàn) removeClippedSubviews 的功能也非常直接,需要更新界面 Layout 的時候,遍歷所有的子 View,看子 View 是否在 mClippingRect 區(qū)域內(nèi),如果在,就通過 addViewInLayout() 方法添加此 View,否者就通過 removeViewsInLayout() 方法移除它。

到這了,我們就可以解釋前面的矛盾了。雖然在 ScrollView 的 View Hierarchy 中,會自動移除不顯示的 View,但是實際上還是創(chuàng)建了所有的子 View,所以所占內(nèi)存和加載時間會線性增加。

關(guān)于創(chuàng)建所有子 View,我這里可以多分析一下。我們知道在 Android 中,創(chuàng)建 View 的代價是很大的。特別是在 ScrollView 中,所有的子 View 都是同時創(chuàng)建的。如果 ScrollView 中子 View 的數(shù)量很多,這樣的代價累加起來,對 APP 造成的延遲和卡頓是相當可觀的。例如前面的測試中有 1000 個子組件,加載時間竟然長達 9.5 秒。我們用Method Tracing 看一下創(chuàng)建一個子 View 所花的時間,如下圖: 

 

 

 

這里只是簡單的創(chuàng)建一個 TextView 就消耗了大約 25ms 的時間。當然 Tracing 過程本身會拖慢 APP 運行,但是不影響我們的結(jié)論。所以 Android 中列表類的控件,都內(nèi)部支持對 View 的復用,盡量避免創(chuàng)建 View。

通過前面的分析,我們可以得到的結(jié)論是:RN 中的 ScrollView 并不像我們想象的那樣高性能。

4 ListView

在這里提到 ListView,是因為 RN 中的 ListView 就是基于 ScrollView 的,但是有一些優(yōu)化。這里簡要介紹一些 ListView 的原理。

ListView 其實是對 ScrollView 的一個封裝,對應(yīng)到 Native 平臺,和 ScrollView 的表現(xiàn)一模一樣。但是 ListView 在顯示列表內(nèi)容的時候,會根據(jù)滑動距離,逐步向 ScrollView 中添加子組件(通過調(diào)用 renderRow() 方法)。注意到 ListView 有 initialListSize 屬性,表示第一次加載的時候添加多少個子項,默認是 10,還有 pageSize 屬性,表示每次需要添加的時候,增加多少個子項,默認是 1。

通過上面的分析我們可以看到,ListView 在第一次加載的時候,不論你的列表有多大,默認最多加載 initialListSize 個子項,所以能保證啟動速度,如果還沒有充滿,或者在向下滑動過程中,再組件添加子項。這樣的操作似乎比較合理,但是注意到,整個操作中,會逐漸向 ListView 中添加子項,新出現(xiàn)的子項,都是通過創(chuàng)建新的 View,而完全沒有復用的過程。所以,如果在應(yīng)用中,ListView 中的子項數(shù)量特別多,ListView 往下滑動的過程中,內(nèi)存會逐漸上漲的。

值得一提的是,ListView 提供了 renderScrollComponent,可以使用其他 Scroll 組件來替換 ScrollView,并且 RecyclerViewBackedScrollView 組件來作為備選。看到這個名字我很欣喜,說明它支持子項的回收復用(Recycler)。首先,看到 iOS 的實現(xiàn) RecyclerViewBackedScrollView.ios.js,其實它就是 ScrollView,并沒有實現(xiàn)所謂的復用,失望了一半。繼續(xù)看 Android 的實現(xiàn),它實際上是對應(yīng) Native 的 com.facebook.react.views.recyclerview.AndroidRecyclerViewBackedScrollView,它繼承與 Android 的 RecyclerView。看到這里,如果使用這種方法,我直觀感覺 RN 的 ListView 性能在 Android 上表現(xiàn)應(yīng)該會比 iOS 好。

我們繼續(xù)來看它是怎么實現(xiàn)回收復用的,AndroidRecyclerViewBackedScrollView 內(nèi)部實現(xiàn)了一個 RecyclerView.Adapter,如下:

  1. static class ReactListAdapter extends Adapter<ConcreteViewHolder> { 
  2.   
  3.   private final List<View> mViews = new ArrayList<>(); 
  4.   
  5.   public void addView(View child, int index) { 
  6.     mViews.add(index, child); 
  7.     ... 
  8.   } 
  9.   
  10.   public void removeViewAt(int index) { 
  11.     View child = mViews.get(index); 
  12.     if (child != null) { 
  13.       mViews.remove(index); 
  14.       ... 
  15.     } 
  16.   } 
  17.   
  18.   @Override 
  19.   public ConcreteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  20.     return new ConcreteViewHolder(new RecyclableWrapperViewGroup(parent.getContext())); 
  21.   } 
  22.   
  23.   @Override 
  24.   public void onBindViewHolder(ConcreteViewHolder holder, int position) { 
  25.     RecyclableWrapperViewGroup vg = (RecyclableWrapperViewGroup) holder.itemView; 
  26.     View row = mViews.get(position); 
  27.     if (row.getParent() != vg) { 
  28.       vg.addView(row, 0); 
  29.     } 
  30.   } 
  31.   
  32.   @Override 
  33.   public void onViewRecycled(ConcreteViewHolder holder) { 
  34.     super.onViewRecycled(holder); 
  35.     ((RecyclableWrapperViewGroup) holder.itemView).removeAllViews(); 
  36.   }   
  37.  

注意到這里有一個 mViews,用來保存所有的子 View,綁定 View 的時候只是簡單用一個空的 View(RecyclableWrapperViewGroup)包了一下。這樣一來,RecyclerView 完全沒有什么起到復用的作用呀!測試一下,確實也是這樣,性能問題還是很嚴重。

這里我們也可以得到一個結(jié)論:RN 中的 ListView 也不是我們想象的 ListView 該有的性能。

5 改進方案

通過前面的分析,我們已經(jīng)知道了 RN 中的 ScrollView 或者 ListView 的性能瓶頸了,同時也有了改進的思路。下面針對各種情況分析:

  1. 如果要優(yōu)化首次加載速度,也就是啟動速度:可以參考 TAT.ronnie 的文章中的方法,根據(jù)實際情況,最小化 ScrollView 或者 ListView 初始子項數(shù)量;
  2. 優(yōu)化內(nèi)存:因為 ScrollView/ListView 會保存所有子 View 在內(nèi)存中,因為我們沒法刪掉子項,但是我們可以盡量減少每個子項所占的內(nèi)存。例如這個項目 react-native-sglistview,它在子項不可見的時候,就把它退化成一個最基本的 View;
  3. 終極解決方案:要真正達到高性能,就需要盡量少的創(chuàng)建 View,要想辦法真正重復利用已經(jīng)創(chuàng)建的子項。目前只有一些想法,待我實現(xiàn)了,再來更新。
責任編輯:龐桂玉 來源: 安卓開發(fā)精選
相關(guān)推薦

2017-04-17 06:07:01

React Nativ開發(fā)性能

2016-11-23 16:48:20

react-nativandroidjavascript

2016-10-13 19:01:59

React NativUbuntu

2025-01-24 08:34:28

CSSWebAndroid

2023-09-04 08:32:43

web開發(fā)圖像

2023-06-24 17:09:06

React前端

2016-08-12 13:55:06

2024-07-08 00:00:07

2016-08-12 08:49:46

React NativFacebookNative

2015-09-22 09:50:36

FacebookAndroid

2017-09-11 14:35:34

編輯器開發(fā)環(huán)境React

2024-08-29 08:31:16

2022-07-28 14:33:32

webviewweb頁面

2023-01-29 08:00:00

Instagram濾鏡圖片編輯

2017-03-21 21:37:06

組件UI測試架構(gòu)

2017-03-09 13:29:04

ReactNative JSPatch

2024-02-20 01:53:01

ReactFlutter開發(fā)

2016-08-15 13:34:37

React NativiOSjs入口

2024-01-19 09:03:06

ReactTypeScripFlexbox

2017-01-11 18:44:43

React Nativ觸摸事件Android
點贊
收藏

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

欧美黑人在线观看| 91久久夜色精品国产网站| xxxx黄色片| 成人黄色免费短视频| 中文字幕五月欧美| 91在线短视频| 天堂网视频在线| 99久久.com| 亚洲高清久久网| 人人干人人干人人| 国产精品蜜臀| 亚洲国产精品成人综合色在线婷婷| 91影视免费在线观看| 可以免费在线观看的av| 外国成人免费视频| 亚洲欧美精品伊人久久| 在线观看免费看片| 成人黄页网站视频| 欧美日韩国产页| 天天综合色天天综合色hd| 黄色片一区二区三区| 日本免费新一区视频| 久久人人97超碰精品888| 精品人妻无码一区| 老牛国内精品亚洲成av人片| 欧美日韩夫妻久久| 任你操这里只有精品| 免费在线观看黄色| 国产丝袜美腿一区二区三区| 国产精品三区www17con| 一区二区三区黄| 石原莉奈在线亚洲二区| 亚州成人av在线| 深夜福利影院在线观看| 日韩综合精品| 一色桃子一区二区| 欧美激情aaa| 日韩区一区二| 欧美一区二区三区免费视频| 久久久精品三级| 亚洲一区资源| 日韩欧美在线视频免费观看| 天天夜碰日日摸日日澡性色av| 免费观看在线午夜影视| 国产精品水嫩水嫩| 日韩av电影免费在线| 欧美美女搞黄| 国产亚洲制服色| 欧美成人一区二区在线| 五月天婷婷在线播放| 成人免费高清在线| 国产成人亚洲欧美| 国内毛片毛片毛片毛片| 国产美女一区二区| 亚洲a在线播放| av网站在线免费看| 国产精品1区2区| 国产精品久久精品国产| 高h放荡受浪受bl| 国产精品77777| 福利视频一区二区三区| 懂色av蜜臀av粉嫩av分享吧| 国产a区久久久| 国产精品免费看一区二区三区| 亚洲爱情岛论坛永久| 国产成人精品综合在线观看 | 久热精品在线观看| 欧美日韩第一区| 91精品国产91久久久久久久久 | 日本sm残虐另类| 国产免费成人av| 国产精品九九九九| 国产成人鲁色资源国产91色综| 国产九区一区在线| 欧美日韩伦理片| 国产欧美精品区一区二区三区| 亚洲精品免费在线看| av在线app| 性欧美大战久久久久久久久| 女性隐私黄www网站视频| 国产原创一区| 日韩欧美色综合网站| 玖玖爱在线精品视频| 国产欧美日韩精品高清二区综合区| 日韩中文字幕在线视频| 欧美爱爱小视频| 制服诱惑一区二区| 国产精品一香蕉国产线看观看| 国产又粗又猛又黄又爽| 波多野结衣中文一区| 欧美一进一出视频| h片在线播放| 欧美日韩国产页| 国产福利在线免费| 国产精品久久久久久久久久白浆| 亚洲欧美一区二区激情| 亚洲人与黑人屁股眼交| 在线看片欧美| 国产精品入口免费视频一| 亚洲成人av综合| 欧美经典三级视频一区二区三区| 国产91在线亚洲| 欧美日韩视频免费观看| 日韩精品最新网址| 一道本在线观看| 伊人蜜桃色噜噜激情综合| 欧洲成人在线观看| 精品国产va久久久久久久| 久久久久久久国产精品影院| 可以在线看黄的网站| 欧美性suv| 精品动漫一区二区三区在线观看 | 一区二区三区四区在线播放| 农村妇女精品一二区| 精品麻豆剧传媒av国产九九九| 精品亚洲精品福利线在观看| 欧美日韩一级在线观看| 日韩高清在线观看| 精品国产区在线| 在线观看电影av| 欧美少妇一区二区| 青青草视频成人| 欧美午夜精品| 亚洲一区二区三区久久| av在线中文| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 中文在线手机av| 欧美亚洲综合色| 玖玖爱在线观看| 一本久道久久综合狠狠爱| 亚洲自拍高清视频网站| av色图一区| 色吊一区二区三区| 黄色工厂在线观看| 亚洲国产免费看| 91精品国产综合久久久久久丝袜| 91在线观看| 色狠狠桃花综合| 亚洲v国产v欧美v久久久久久| 日韩视频二区| 精品日韩美女| 日韩脚交footjobhd| 欧美成人精品福利| 久久久香蕉视频| 国产高清不卡一区二区| 日本三日本三级少妇三级66| 99精品美女视频在线观看热舞| 自拍偷拍亚洲在线| 在线免费观看一区二区| 国产精品无人区| 日日干夜夜操s8| 久久久综合色| 91九色国产在线| 国产欧美久久久久久久久| 91精品欧美综合在线观看最新| 午夜国产福利视频| 久久99国产精品成人| 一本色道久久综合亚洲精品婷婷| 亚洲一区导航| 欧美精品在线看| www.国产麻豆| 午夜免费久久看| 亚洲激情视频小说| 麻豆九一精品爱看视频在线观看免费| 欧美日韩三区四区| 成人黄页网站视频| 美女999久久久精品视频| 亚洲第一精品网站| 午夜精品国产更新| 国产特级黄色录像| 麻豆久久久久久久| 警花观音坐莲激情销魂小说 | 精品欧美一区二区久久| 国产午夜久久久| 26uuu国产日韩综合| 波多结衣在线观看| 一本一本久久a久久综合精品| 91久久精品一区二区别| av中文字幕在线观看第一页| 亚洲美女在线观看| 91久久精品国产91性色69| 亚洲欧美另类久久久精品| 欧美夫妇交换xxx| 久热精品在线| 国产系列第一页| 卡一精品卡二卡三网站乱码| 国产精品视频色| 视频在线观看入口黄最新永久免费国产 | 玖玖玖免费嫩草在线影院一区| 日韩av高清不卡| 成人在线网址| 国产婷婷97碰碰久久人人蜜臀| 一区二区三区在线免费观看视频 | 97久久精品人人澡人人爽| 妺妺窝人体色www在线观看| 亚洲乱码精品| 欧美日韩精品综合| 亚洲1区在线观看| 日本久久久a级免费| 成人福利网站| 国产一区二区三区精品久久久 | av大片免费观看| 中文字幕人成不卡一区| 日本一级片在线播放| 九九在线精品视频| 日韩免费毛片视频| 欧美日韩1区| 中文字幕剧情在线观看一区| 精品国产影院| 2019国产精品视频| 欧美激情不卡| 97激碰免费视频| 91国内在线| 日韩一级裸体免费视频| 日本天堂在线| 精品国精品国产| 国产精品无码久久久久成人app| 精品日韩美女的视频高清| 九九精品视频免费| 中文字幕国产一区二区| 一女三黑人理论片在线| 国产高清精品网站| 捷克做爰xxxⅹ性视频| 日韩高清一区在线| 亚洲色成人一区二区三区小说| 午夜性色一区二区三区免费视频| 亚洲国产欧美不卡在线观看| 久久av综合| 久久99精品国产一区二区三区| 日韩精品成人| 91在线视频成人| 97色婷婷成人综合在线观看| 国产精品吹潮在线观看| 激情都市亚洲| 欧美在线视频观看免费网站| 黄色软件视频在线观看| 久久的精品视频| 色综合久久影院| 主播福利视频一区| 成人高清免费在线播放| 亚洲人成电影在线观看天堂色| 天天综合网在线| 亚洲国产天堂久久国产91 | 不卡av电影在线播放| 无码人妻一区二区三区精品视频| 国产福利精品一区| 永久看看免费大片| 懂色av一区二区在线播放| aaaaa黄色片| 成人av网站在线观看免费| 国产伦精品一区二区三区88av| 国产999精品久久久久久绿帽| 色男人天堂av| 成人性视频免费网站| 日韩少妇一区二区| 久久人人超碰精品| 久久久久久成人网| 亚洲欧洲精品成人久久奇米网| 日韩精品一区二区亚洲av性色| 亚洲人成人一区二区在线观看| 天天做夜夜爱爱爱| 亚洲制服丝袜av| 国产无码精品久久久| 精品久久久久久久久国产字幕| 国产小视频在线免费观看 | 亚洲精品无amm毛片| 欧美精品一区二区三区视频| 欧美 日韩 综合| 亚洲深夜福利在线| 98在线视频| 九色成人免费视频| 欧美少妇网站| 国产精品久久久久久久天堂 | 91精品国产高清一区二区三区| 99re只有精品| 日韩av在线网| 日本天堂在线观看| 久久久久久18| 欧美成a人片在线观看久| 成人久久久久爱| 久久男人av| 亚洲精品在线免费看| 国产精品v欧美精品v日本精品动漫| 成 年 人 黄 色 大 片大 全| 首页亚洲欧美制服丝腿| www,av在线| 972aa.com艺术欧美| 国产在视频线精品视频| 亚洲国产精品视频| 天天干天天插天天射| 日韩精品中文字幕在线一区| 日韩欧美在线番号| 欧美成人国产va精品日本一级| 综合久久2023| 亚洲字幕一区二区| 国产一区二区三区四区二区| 国产在线拍揄自揄拍无码| 午夜一区在线| 免费不卡av网站| 久久精品人人做人人爽人人| 欧美黄色免费在线观看| 在线精品亚洲一区二区不卡| 亚洲精品久久久久久久久久| 一区二区三区视频观看| 999福利在线视频| 91亚洲国产成人精品性色| 九一精品国产| 成人免费毛片在线观看| 精品一二三四区| 性欧美精品中出| 无吗不卡中文字幕| 亚洲av综合色区无码一二三区| 国产一区二区三区四区福利| a√中文在线观看| 51精品国产人成在线观看| 第一sis亚洲原创| 国产免费一区二区三区视频| 成人蜜臀av电影| 日本在线一级片| 欧美午夜精品一区二区三区| 青梅竹马是消防员在线| 国产最新精品视频| 欧美午夜在线播放| 一个色的综合| 免费在线观看不卡| 国产精品久久久久久久av| 欧美日韩免费观看中文| 亚洲精品久久久久久无码色欲四季| 久久精品久久久久电影| 国产成人a视频高清在线观看| 欧美日韩一区二区三区免费| 日韩网站在线| 少妇精品无码一区二区三区| 亚洲一区二区在线观看视频| 精品国产乱码一区二区三 | 国产无遮挡免费视频| 日韩三级在线观看| 精精国产xxxx视频在线| 国产精品久久久久久久久久免费| 亚洲人亚洲人色久| 免费看的黄色大片| 99久久久精品免费观看国产蜜| 国产第一页在线播放| 亚洲福利视频在线| 在线观看网站免费入口在线观看国内| 国产麻豆一区二区三区在线观看| 欧美另类女人| 超碰在线资源站| 亚洲激情五月婷婷| 精品国产伦一区二区三区| 欧美激情啊啊啊| 凹凸av导航大全精品| 97超碰在线人人| 91看片淫黄大片一级在线观看| 成人免费毛片男人用品| 国产亚洲激情视频在线| 高清在线一区| 亚洲一区二区四区| 国产一区二区三区在线观看免费| 免费三级在线观看| 亚洲成人xxx| 粉嫩一区二区| 亚洲区一区二区三区| 国内精品久久久久影院一蜜桃| 免费无遮挡无码永久在线观看视频| 精品美女一区二区三区| 亚洲欧洲日本韩国| 神马影院午夜我不卡| 精品一区二区综合| 久久免费播放视频| 亚洲免费人成在线视频观看| 91亚洲视频| 特级西西人体www高清大胆| 成人福利视频在线| 无码无套少妇毛多18pxxxx| www.亚洲人.com| 成人台湾亚洲精品一区二区| 精品国产成人av在线免| 亚洲欧洲av另类| 老牛影视av牛牛影视av| 国产成+人+综合+亚洲欧洲| 天堂美国久久| 亚洲一区二区三区综合| 欧美日韩三级一区二区| 欧美xxxxhdvideosex| 欧美日韩精品免费看| 国产一区二区三区四| 国产一级精品视频| 视频在线观看一区二区| jizz久久精品永久免费| www黄色在线| 亚洲一区电影777| 东热在线免费视频| 国产成人精品免费视频大全最热| 久久三级福利| 农民人伦一区二区三区| 欧美 日韩 精品| 欧美日韩激情在线| 2021中文字幕在线| 亚洲在线播放电影|