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

移動端渲染原理淺析

原創 精選
移動開發 移動應用
本文主要介紹了移動端渲染原理的相關內容。文章開始介紹了一下渲染相關的基礎知識,講了渲染所需要的原始數據源-位圖以及 CPU 和 GPU 如何協同工作得到位圖數據的。

作者 | 尚懷軍

計算機或手機的渲染是一個非常復雜的過程,本文介紹了渲染相關的一些基礎知識,并結合 iOS 和安卓的技術框架介紹了移動端渲染原理,最后詳細的解析了 iOS 中的離屏渲染以及圓角優化的一些方法。

渲染基礎知識

屏幕繪制的原始數據源

位圖

我們在屏幕上繪制圖像需要的原始數據叫做位圖。位圖(Bitmap) 是一種數據結構。一個位圖是由 n*m 個像素組成,每個像素的顏色信息由 RGB 組合或者灰度值表示。根據位深度,可將位圖分為 1、4、8、16、24 及 32 位圖像等。每個像素使用的信息位數越多,可用的顏色就越多,顏色表現就越逼真,越豐富,相應的數據量越大。

物理像素和邏輯像素

位圖一般存儲的是物理像素,而應用層一般用的是邏輯像素,物理像素和邏輯像素之間會存在一定的對應關系。例如,iOS 中物理像素和邏輯像素的對應關系如下:

  • iOS1 倍屏 1pt 對應 1 個物理像素
  • iOS2 倍屏 1pt 對應 2 個物理像素
  • iOS3 倍屏 1pt 對應 3 個物理像素

將位圖繪制到顯示器

上邊講了屏幕上繪制圖像需要的原始數據叫做位圖。那么問題來了,有了位圖數據之后如何將圖像繪制到屏幕上呢?如下圖所示:電子槍從上到下逐行掃描,掃描完成后顯示器就呈現一幀畫面。然后電子槍回到屏幕初始位置進行下一次掃描。為了同步顯示器的顯示過程和視頻控制器的掃描過程,顯示器會用硬件時鐘產生一系列的定時信號。當電子槍換行進行掃描時,顯示器會發出一個水平同步信號;當一幀畫面繪制完成后,電子槍回到原位,準備畫下一幀前,顯示器會發出一個垂直同步信號。顯示器通常以固定的頻率進行刷新,這個刷新率就是垂直同步信號產生的頻率。

CPU、GPU、顯示器協同工作流程

前一部分介紹了視頻控制器將位圖數據顯示到物理屏幕上的過程,那么位圖數據是怎么得到的呢?其實位圖數據是通過 CPU、GPU 協同工作得到的。下圖就是常見的 CPU、GPU、顯示器協同工作的流程。CPU 計算好顯示內容提交至 GPU,GPU 渲染完成后將渲染結果存入幀緩沖區,接下來就需要將得到的像素信息顯示在物理屏幕上了,這時候視頻控制器(Video Controller)會讀取幀緩沖器中的信息傳遞給顯示器(Monitor)進行顯示。完整的流程如下圖所示:

CPU 和 GPU 的區別

講到 CPU、GPU、顯示器的協同工作流程,就不得不提一下 CPU 和 GPU 的區別。

CPU是中央處理器,適合單一復雜邏輯,而GPU是圖形處理器,適合高并發簡單邏輯。

GPU 有特別多的的計算單元和超長的流水線,但是控制邏輯非常簡單,并且還省去了緩存,適合對低延遲要求不高的運算。而 CPU 不僅被 Cache 占據了大量空間,而且還有特別復雜的控制邏輯,相比之下計算能力只是 CPU 很小的一部分。圖形渲染涉及到的矩陣運算比較多,矩陣相關的運算可以被拆分成并行的簡單的運算,所以渲染處理這件事特別適合 GPU 去做。

總結來說:GPU 的工作計算量大,但技術含量不高,需要簡單重復很多次。就好比有個工作需要算成百上千次一百以內加減乘除一樣。而 CPU 就像老教授,積分微分都會算,適合處理單一復雜邏輯運算。

通用渲染流水線

我們通常將圖像繪制的完整流程稱為渲染流水線,這個過程是 CPU 和 GPU 協作完成的。一般一個渲染流程可以分成 4 個概念階段,分別是:應用階段(Application Stage),幾何階段(Geometry Stage),光柵化階段(Rasterizer Stage),像素處理階段(Pixel Processing)。在《Real–Time Rendering 4th》中非常透徹的講解了實時渲染的各種知識點,對渲染原理感興趣的可以看看這本書,這本書堪稱“實時渲染圣經”。下邊會簡單介紹一下這幾個過程。

應用階段(Application Stage)

簡而言之,就是圖像在應用中的處理階段。說白了就是一段運行在 CPU 上的程序,這時還沒有 GPU 什么事。這一階段主要是 CPU 負責處理用戶的交互和操作,然后做一些應用層布局相關的處理,最后輸出圖元(點、線和三角形)信息給到下一階段。

大家可能會疑惑,圖元只有簡單的點、線、三角形,能表示豐富的立體圖形么,下邊這張立體感很強的海豚就能給出肯定的答案了,簡單的三角形再加上不同的著色,就能呈現出立體圖形。

幾何階段(Geometry Stage)

1. 頂點著色器(Vertex Shader)

頂點著色器可以對頂點的屬性進行一些基本的處理。將頂點信息進行視角轉換、添加光照信息、增加紋理等操作。CPU 丟給 GPU 的信息,就好像是站在上帝視角把這個視角看到的所有信息都給到 GPU。而 GPU 則是站在人類的角度,將人類可以觀察到的畫面,輸出在顯示器上。所以這里是以人的視角為中心,進行坐標轉換。

2. 形狀裝配(Shape Assembly)這個階段是將頂點著色器輸出的所有頂點作為輸入,并將所有的點裝配成指定圖元的形狀。圖元(Primitive)如:點、線、三角形。這個階段也叫圖元裝配。

3. 幾何著色器(Geometry Shader)在圖元外添加額外的頂點,將原始圖元轉換成新圖元,來構建更加復雜的模型。

光柵化階段(Rasterizer Stage)

光柵化階段會把前三個幾何階段處理后得到的圖元(primitives)轉換成一系列的像素。

如上圖所示,我們可以看到,每個像素的中心有一個點,光柵化便是用這個中心點來進行劃分的,如果中心點在圖元內部,那么這個中心點所對應的像素就屬于該圖元。簡而言之,這一階段就是將連續的幾何圖形轉化為了離散化的像素點。

像素處理階段(Pixel Processing)

1. 片段著色器(Fragment Shader)

通過上述的光柵化階段之后,我們就拿到了各個圖元對應的像素,最后這個階段要做的事情就是給每個 Pixel 填充上正確的顏色,然后通過一系列處理計算,得到相應的圖像信息,最終輸出到顯示器上。這里會做內插,就像補間動畫一樣。比如想要把一系列散點連成平滑曲線,相鄰的已知點之間可能會缺少很多點,這時候就需要通過內插填補缺少的數據,最終平滑曲線上除已知點之外的所有點都是插值得到的。同樣的,三角形的三個角色值給定后,其它的片段則根據插值計算出來,也就呈現來漸變的效果。

2. 測試與混合(Tests and Blending)

這個階段會檢測對應的深度值(z 坐標),來判斷這個像素位于其它圖層像素的前面還是后面,決定是否應該丟棄。此外,該階段還會檢查 alpha? 值( alpha 值定義了一個像素的透明度),從而對圖層進行混合。( 一句話簡單說,就是檢查圖層深度和透明度,并進行圖層混合。)

R = S + D * (1 - Sa)

含義:
R:Result,最終像素顏色。
S:Source,來源像素(上面的圖層像素)。
D:Destination,目標像素(下面的圖層像素)。
a:alpha,透明度。

結果 = S(上)的顏色 + D(下)的顏色 * (1 - S(上)的透明度)

經歷了上邊漫長的流水線之后我們便可以拿到屏幕繪制所需要的原始數據源-位圖數據,然后由視頻控制器把位圖數據顯示在物理屏幕上。

iOS 渲染原理

渲染技術棧

上邊鋪墊完渲染相關的一些基礎知識之后,下面主要介紹 iOS 渲染相關的一些原理和知識。下圖是 iOS 的圖形渲染技術棧,有三個相關的核心系統框架:Core Graphics、Core Animation、Core Image ,這三個框架主要用來繪制可視化內容。他們都是通過 OpenGL 來調用 GPU 進行實際的渲染,然后生成最終位圖數據存儲到幀緩沖區,視頻控制器再將幀緩沖區的數據顯示物理屏幕上。

UIKit

UIKit  是 iOS 開發者最常用的框架,可以通過設置  UIKit  組件的布局以及相關屬性來繪制界面。但是  UIKit  并不具備在屏幕成像的能力,這個框架主要負責對用戶操作事件的響應(UIView  繼承自  UIResponder),事件經過響應鏈傳遞。

Core Animation

Core Animation  主要負責組合屏幕上不同的可視內容,這些可視內容可被分解成獨立的圖層也就是我們日常開發過程中常接觸的 CALayer,這些圖層被存儲在圖層樹中。CALayer 主要負責頁面渲染,它是用戶能在屏幕上看見的一切的基礎。

Core Graphics

Core Graphics 主要用于運行時繪制圖像。開發者可以使用此框架來處理基于路徑的繪圖,轉換,顏色管理,離屏渲染,圖案,漸變和陰影等等。

Core Image

Core Image  與  Core Graphics 正好相反,Core Graphics  是在運行時創建圖像,而  Core Image  則是在運行前創建圖像。

OpenGL ES 和 Metal

OpenGL ES 和 Metal 都是第三方標準,基于這些標準具體的內部實現是由對應的 GPU 廠商開發的。Metal 是蘋果的一套第三方標準,由蘋果實現。很多開發者都沒有直接使用過  Metal,但卻通過 Core Animation、Core Image 這些核心的系統框架在間接的使用 metal。

CoreAnimation 與 UIKit 框架的關系

上邊渲染框架中提到的 Core Animation 是 iOS 和 OS X 上圖形渲染和動畫的基礎框架,主要用來給視圖和應用程序的其他可視元素設置動畫。Core Animation 的實現邏輯是將大部分實際繪圖的工作交給 GPU 加速渲染,這樣不會給 CPU 帶來負擔,還能實現流暢的動畫。CoreAnimation 的核心類是 CALayer,UIKit 框架的核心類是 UIView,下邊詳細介紹一下這兩個類的關系。

UIView 與 CALayer 的關系

如上圖所示,UIView 和 CALayer 是一一對應的關系,每一個 UIView 都有一個 CALayer 與之對應,一個負責布局、交互響應,一個負責頁面渲染。

他們的兩個核心關系如下:

  • CALayer 是 UIView 的屬性之一,負責渲染和動畫,提供可視內容的呈現。
  • UIView 提供了對 CALayer 功能的封裝,負責了交互事件的處理。

舉一個形象一點的例子,UIView 是畫板,CALayer 就是畫布,當你創建一個畫板的時候,會自動綁定一個畫布,畫板會響應你的操作,比如你可以移動畫板,畫布則負責呈現具體的圖形,二者職責分明。一個負責交互,一個負責渲染繪制。

為什么要分離出 CALayer 和 UIView?

iOS 平臺和 MacOS 平臺上用戶的交互方式有著本質的不同,但是渲染邏輯是通用的,在 iOS 系統中我們使用的是 UIKit 和 UIView,而在 MacOS 系統中我們使用的是 AppKit 和 NSView,所以在這種情況下將展示部分的邏輯分離出來跨平臺復用。

CALayer 中的 contents 屬性保存了由設備渲染流水線渲染好的位圖 bitmap(通常被稱為 backing store),也就是我們最開始說的屏幕繪制需要的最原始的數據源。而當設備屏幕進行刷新時,會從 CALayer 中讀取生成好的 bitmap,進而呈現到屏幕上。

@interface CALayer : NSObject <NSSecureCoding, CAMediaTiming>
/** Layer content properties and methods. **/

/* An object providing the contents of the layer, typically a CGImageRef,
* but may be something else. (For example, NSImage objects are
* supported on Mac OS X 10.6 and later.) Default value is nil.
* Animatable. */

@property(nullable, strong) id contents;
@end

Core Animation 流水線

其實早在 WWDC 的 Advanced Graphics and Animations for iOS Apps(WWDC14 419,關于 UIKit 和 Core Animation 基礎的 session)中蘋果就給出了 CoreAnimation 框架的渲染流水線,具體流程如下圖所示:

整個流水線中 app 本身并不負責渲染,渲染則是由一個獨立的進程負責,即  Render Server  進程。下邊會詳細介紹一下整個 pipeline 的流程。

應用階段

  • 視圖的創建
  • 布局計算
  • 對圖層進行打包,在下一次 RunLoop 時將其發送至Render Server
  • app 處理用戶的點擊操作,在這個過程中 app 可能需要更新視圖樹,如果視圖樹發生更新,圖層樹也會被更新
  • 其次,app 通過 CPU 完成對顯示內容的計算

Render Server & GPU

  • 這一階段主要執行 metal、Core Graphics 等相關程序,并調用 GPU 在物理層上完成對圖像的渲染
  • GPU 將渲染后的位圖數據存儲到 Frame Buffer

Display

  • 視頻控制器將幀緩沖區的位圖數據一幀一幀的顯示在物理屏幕上

如果把把上邊的步驟串在一起,會發現它們執行消耗的時間超過了 16.67 ms,因此為了滿足對屏幕的 60 FPS 刷新率的支持,需要通過流水線的方式將這些步驟并行執行,如下圖所示。每一個階段都在源源不斷的給下一個階段輸送產物。這時候就可以滿足 16.67 毫秒產生一幀數據的要求了。

安卓渲染原理

安卓上層顯示系統

安卓中 Activity 的一個重要的職責就是對界面生命周期的管理,這也就伴隨了對視圖窗口的管理。這中間就涉及了兩個 Android 中兩個主要的服務,AMS(ActivityManagerService)和WMS(WindowManagerService)。

在 Android 中,一個 view 會有對應的 canvas。視圖樹對應一個 canvas 樹,Surfaceflinger 控制多個 canvas 的合成。最終渲染完成輸出位圖數據,顯示到手機屏幕。

應用層布局

View 和 ViewGroup

View 是 Android 中所有控件的基類,View 類有一個很重要的子類:ViewGroup,ViewGroup 作為其他 view 的容器使用。Android 的所有 UI 組件都是建立在 View、ViewGroup 基礎之上的,整體采用“組合”的思想來設計 View 和 ViewGroup:ViewGroup 是 View 的子類,所以 ViewGroup 也可以被當做 View 使用。一個 Android app 的圖形用戶界面會對應一個視圖樹,而視圖樹則對應一個 canvas 樹。這個有點兒類似于 iOS 中的 UIView 和 CALayer 的概念,一個負責應用層布局,一個負責底層渲染。

系統底層渲染顯示

應用層的 view 對應到 canvas,canvas 到系統進程就成了 layer。SurfaceFlinger 主要提供 layer 的渲染合成服務。SurfaceFlinger 是一個常駐的 binder 服務,會隨著 init 進程的啟動而啟動。下面這張圖就詳細的介紹了上層 view 到底層 layer 的轉化,以及 SurfaceFlinger 對多個 layer 的渲染合成。

iOS 離屏渲染

離屏渲染原理以及定義

首先來介紹一下離屏渲染的原理。我們正常的渲染流程是:CPU 和 GPU 協作,不停地將內容渲染完成后得到的位圖數據放入 Framebuffer (幀緩沖區)中,視頻控制器則不斷地從 Framebuffer 中獲取內容,顯示實時的內容。

而離屏渲染的流程是這樣的:

與普通情況下 GPU 直接將渲染好的內容放入 Framebuffer 中不同,離屏渲染需要先額外創建離屏渲染緩沖區 ,將提前渲染好的內容放入其中,等到合適的時機再將 Offscreen Buffer 中的內容進一步疊加、渲染,完成后將結果再寫入 Framebuffer 中。

為什么先要將數據存放在離屏渲染緩沖區呢?有兩個原因,一個是被動的,一個是主動的。

  1. 一些特殊效果需要使用額外的 Offscreen Buffer 來保存渲染的中間狀態(被動)
  2. 處于效率目的,可以將內容提前渲染保存在 Offscreen Buffer 中,達到復用的目的。(主動)

被動離屏渲染

常見的觸發被動離屏渲染的場景

透明、陰影加圓角通常被稱為 UI 三大寶,但這些效果在 iOS 的日常開發過程中卻往往會導致被動的離屏渲染,下邊是幾個常見的會觸發被動離屏渲染的場景。

觸發離屏渲染的原因

講離屏渲染的原因不得不提畫家算法,畫家算法的整體思想是按層繪制,首先繪制距離較遠的場景,然后用繪制距離較近的場景覆蓋較遠的部分。這里的層在 iOS 的渲染技術棧中就可以被對應到 layer。

通常對于每一層 layer,Render Server 會遵循“畫家算法”,按次序輸出到 frame buffer,后一層覆蓋前一層,就能得到最終的顯示結果,對于這個 layer 樹則是以深度優先的算法將 layer 輸出到 frame buffer。

作為“畫家”的 GPU 雖然可以一層一層往畫布上進行輸出,但是卻沒有辦法在某一層渲染完成之后,再回過頭來改變其中的某個部分。因為在這一層之前的若干層 layer 像素數據,已經在渲染中被合成在一起了。其實這里和 photoshop 中的圖層合并非常像,一旦多個圖層被合并在一起,就無法再單獨對某一個圖層進行修改。所以需要在離屏緩沖區中把子 layer 依次畫好,然后把四個角裁剪好之后再和之前的圖層進行混合。

GPU 離屏渲染的性能影響

一提離屏渲染,我們直觀上的感覺是會對性能有影響。因為為了滿足 60fps 的刷新頻率,GPU 的操作都是高度流水線化的。本來所有的計算工作都在有條不紊地正在向 frame buffer 輸出,這時候突然又有一些特殊的效果觸發了離屏渲染,需要切換上下文,把數據輸出到另一塊內存,這時候流水線中很多中間產物只能被丟棄,這種頻繁的上下文切換對 GPU 的渲染性能有非常大的影響。

如何防止非必要離屏渲染?

  • 對于一些圓角可以創建四個背景顏色弧形的 layer 蓋住四個角,從視覺上制造圓角的效果
  • 對于 view 的圓形邊框,如果沒有 backgroundColor,可以放心使用 cornerRadius 來做
  • 對于所有的陰影,使用 shadowPath 來規避離屏渲染
  • 對于特殊形狀的 view,使用 layer mask 并打開 shouldRasterize 來對渲染結果進行緩存

圓角實現的優化策略

使用CALayer的cornerRadius并設置 cliptobounds 以后會觸發離屏渲染(offscreen rendering)。滾動時每秒需要在 60 幀上執行裁剪操作,即使內容沒有發生任何變化。GPU 也必須在每幀之間切換上下文,合成整個幀和裁剪。這些對性能的消耗直接影響到 Render Server 這個獨立渲染進程,造成掉幀。為了優化渲染性能,我們可以選擇一些其他的實現圓角的方案。下邊是圓角的具體實現需要考慮的條件。

圓角的具體實現需要考慮的條件

  1. 圓角下(movement underneath the corner)是否有滑動。
  2. 是否有穿過圓角滑動(movement through the corner)。
  3. 四個圓角是否處于同一個 layer 上,有沒有與其他 子 layer 相交。

圓角的具體實現方案

如何根據對應的條件選取圓角的實現方案

上邊提到了圓角的優化要考慮的條件以及不同的圓角實現方案,下邊這個流程圖就是把條件和方案對應起來,給出了圓角的最佳實現方案。

總結

本文主要介紹了移動端渲染原理的相關內容。文章開始介紹了一下渲染相關的基礎知識,講了渲染所需要的原始數據源-位圖以及 CPU 和 GPU 如何協同工作得到位圖數據的。后面又結合 iOS 和安卓的技術框架介紹了移動端渲染的相關原理。最后深入分析了 iOS 中的離屏渲染,講解了現有的圓角優化的一些方案。

責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2021-04-26 13:20:06

Vue服務端渲染前端

2017-04-12 11:46:46

前端瀏覽器渲染機制

2017-03-02 12:39:04

移動端iOS監控體系

2020-08-05 08:21:41

Webpack

2016-12-08 10:57:08

渲染引擎前端優化

2016-01-05 09:45:57

設計版式

2015-12-16 12:40:32

H5緩存機制移動

2011-07-19 13:26:50

iPhone PhoneGap 框架

2009-07-16 10:23:30

iBATIS工作原理

2023-05-11 07:25:57

ReduxMiddleware函數

2020-11-05 11:14:29

Docker底層原理

2016-01-08 11:35:01

移動端設計版面

2024-02-22 13:47:40

2012-08-30 16:19:08

移動辦公明朝萬達

2012-05-07 13:55:41

JavaJava Web

2010-09-25 14:01:11

Java跨平臺

2019-08-05 13:20:35

Android繪制代碼

2011-04-13 15:01:39

2020-11-06 15:20:45

瀏覽器前端架構

2009-07-15 17:33:08

Swing客戶端
點贊
收藏

51CTO技術棧公眾號

国产成人在线视频| 亚洲精品综合久久中文字幕| 超碰在线免费观看97| 丁香花免费高清完整在线播放| 99国产成+人+综合+亚洲欧美| 日韩电影中文 亚洲精品乱码| 亚洲视频在线a| 欧美一卡二卡| 久久精品人人爽人人爽| 亚洲综合精品伊人久久| 欧美精品一二三四区| 国产精品伦理久久久久久| 精品国精品国产尤物美女| 久久精品香蕉视频| 9191在线播放| 久久亚洲综合av| 亚洲综合色激情五月| 免费看日批视频| 欧美精品一区二区三区久久久竹菊| 日韩精品免费在线| 亚洲国产精品第一页| 中文字幕系列一区| 欧美日韩亚洲精品内裤| 国产专区在线视频| 91激情在线| 91小视频免费观看| 99免费在线观看视频| 亚洲av无码乱码国产精品fc2| 黄色亚洲在线| 免费不卡欧美自拍视频| 日本一道本视频| 奇米777国产一区国产二区| 日韩欧美国产综合一区 | 91在线观看免费高清完整版在线观看 | 欧美激情久久久久久久久久久| 欧美久久久久久蜜桃| av观看免费在线| √最新版天堂资源网在线| 亚洲视频在线观看一区| 一区二区三区偷拍| 成年人在线视频| 久久久久久黄色| 国产乱人伦精品一区二区| 国产农村妇女毛片精品久久| 青青草国产精品97视觉盛宴| 奇米四色中文综合久久| 国产区在线观看视频| 亚洲午夜一级| 国内精品400部情侣激情| 久久精品视频免费在线观看| 婷婷中文字幕一区| 神马久久桃色视频| 久久噜噜色综合一区二区| 日韩综合网站| 久久九九亚洲综合| www.xxxx日本| 欧美日韩 国产精品| 欧美大码xxxx| 免费麻豆国产一区二区三区四区| 在线观看免费一区二区| 久久99国产精品自在自在app | 2一3sex性hd| 国产+成+人+亚洲欧洲在线| 亚洲а∨天堂久久精品9966 | a天堂视频在线| 国产精品一区二区在线观看不卡| 91精品国产99久久久久久红楼| 国内老熟妇对白xxxxhd| 成人涩涩免费视频| 欧美二区三区在线| 成人在线观看黄色| 最新国产精品久久精品| 日韩久久久久久久久久久久| 污污片在线免费视频| 亚洲福利视频一区二区| 国产成人无码一二三区视频| 蜜桃精品在线| 欧美精品日韩一区| 日本人妻一区二区三区| 久久久久97| 亚洲一级一级97网| 日本一二三区在线观看| 国产精品mv在线观看| 欧美在线观看一区二区三区| 99re热视频| 精品系列免费在线观看| av成人综合网| 男女网站在线观看| 国产精品国产自产拍高清av王其 | 亚洲永久在线| 91精品久久久久久久久久| 亚洲不卡免费视频| 国产偷国产偷精品高清尤物| 欧美做受777cos| 日韩精品av| 制服丝袜日韩国产| 国产乱了高清露脸对白| 五月天激情综合网| 2025国产精品视频| 国产又黄又爽视频| 26uuu欧美| 8x8ⅹ国产精品一区二区二区| 欧美片第一页| 精品国产一区二区亚洲人成毛片 | 亚洲精品乱码久久久久久9色| 日韩欧美影院| 欧美xxxx18国产| 91porny九色| 成人激情黄色小说| 亚洲午夜精品久久久中文影院av| free性欧美| 欧美日韩国产电影| 搡老熟女老女人一区二区| 牛牛国产精品| 国产免费亚洲高清| 日中文字幕在线| 一区二区三区av电影| 少妇黄色一级片| 三级精品视频| 欧美激情第99页| 国产又黄又爽视频| 欧美国产一区二区| 99999精品视频| 成人动态视频| 欧美另类精品xxxx孕妇| 国产精品久久久久久免费| 久久久午夜精品理论片中文字幕| www.av91| 我要色综合中文字幕| 北条麻妃一区二区三区中文字幕| 天天干,天天干| 91小视频免费看| 黄色一级在线视频| xxxx日韩| 久久久久久美女| 性做久久久久久久| 亚洲美女免费视频| xxww在线观看| 日本不卡免费一区| 国产精品欧美日韩一区二区| 飘雪影院手机免费高清版在线观看 | 亚洲精品一二三**| 久久天天躁狠狠躁夜夜躁2014| 中国精品一区二区| 欧美激情在线看| 久草福利视频在线| 成人看的视频| 国产精品亚洲美女av网站| 91在线看黄| 欧美日韩中文精品| 日本黄区免费视频观看| 久久国产精品一区二区| 最新精品视频| 久久久久九九精品影院| 久久不射热爱视频精品| 99国产在线播放| 伊人色综合久久天天| www.偷拍.com| 亚洲区欧美区| 欧美人与物videos另类| 日韩av中字| 最近免费中文字幕视频2019| 国产精品久久久久久久免费看| 亚洲精品你懂的| 丰满少妇一区二区三区专区| 午夜精品久久99蜜桃的功能介绍| 国产成人成网站在线播放青青| www.色在线| 亚洲男女性事视频| 中文字幕免费高清在线观看| 亚洲日本va在线观看| 三大队在线观看| 夜久久久久久| 亚洲一区二区三区加勒比| 国产精品一区二区美女视频免费看| 欧美黄色成人网| 青青免费在线视频| 欧美精品一级二级| 久久久一二三区| 国产午夜精品一区二区| 两性午夜免费视频| 一本综合精品| 亚洲精品日韩精品| 午夜视频在线观看精品中文| 18一19gay欧美视频网站| av网站在线播放| 日韩精品一区二区三区中文不卡| 日韩精品视频免费播放| 国产视频视频一区| 久久aaaa片一区二区| 亚洲免费网址| 大地资源网在线观看免费官网| 日韩欧美中文字幕电影| 91精品在线影院| 天堂资源在线| 久热精品视频在线| 十九岁完整版在线观看好看云免费| 欧美日韩亚洲高清一区二区| 日本在线观看视频网站| 中文字幕二三区不卡| 欧美一级片在线免费观看| 日本在线观看不卡视频| 欧美国产日韩激情| 久久久久久久久久久妇女| 久久久精品动漫| 久久久久久亚洲精品美女| 奇米成人av国产一区二区三区| 97caopor国产在线视频| 原创国产精品91| 色窝窝无码一区二区三区成人网站 | 国产精品视频一二三| 成人免费看片载| 精品在线亚洲视频| 亚洲成熟丰满熟妇高潮xxxxx| 狠狠88综合久久久久综合网| 亚洲激情一区二区| 精品在线观看入口| 国产在线精品一区二区三区》| 国产一区二区久久久久| 国产精品久久久久一区二区| 日本蜜桃在线观看视频| 欧美大片免费看| 久草中文在线| 在线观看亚洲视频| 免费黄网站在线观看| 亚洲福利在线播放| 国产av无码专区亚洲av| 欧美二区乱c少妇| 性色av一区二区三区四区| 欧美色videos| 在线天堂中文字幕| 欧美日韩国产一区中文午夜| 日韩欧美亚洲国产| 亚洲主播在线观看| 精品国产乱码久久久久久鸭王1| 中文字幕在线免费不卡| 69xxx免费| 中文字幕免费在线观看视频一区| brazzers精品成人一区| 26uuu国产在线精品一区二区| 欧美激情 亚洲| 不卡欧美aaaaa| 特级西西人体wwwww| 99精品视频在线播放观看| 久久人妻少妇嫩草av无码专区| 国产.欧美.日韩| 伊人网综合视频| www.66久久| 欧美老熟妇乱大交xxxxx| 久久奇米777| b站大片免费直播| 国产人伦精品一区二区| 黄色激情小视频| 亚洲欧美日韩中文字幕一区二区三区| 天天综合天天做| 亚洲一区二区在线视频| 久久久99精品| 亚洲午夜激情av| 91美女免费看| 在线观看亚洲一区| 中文字幕视频一区二区| 777精品伊人久久久久大香线蕉| 国产精品-色哟哟| 欧美成人性战久久| 日韩中文字幕综合| 亚洲一区第一页| 成年人黄视频在线观看| 久久久久久久色| 亚洲第一会所| 91在线视频一区| 成人精品毛片| 热re99久久精品国产99热| 日本一区二区免费高清| 亚洲精品少妇一区二区| 欧美一级网站| 天天干天天av| 成人天堂资源www在线| 91成年人网站| 亚洲男人的天堂在线观看| 国产精品成人免费一区二区视频| 色哟哟一区二区在线观看| 夜夜躁狠狠躁日日躁av| 日韩欧美你懂的| 久久免费看视频| 欧美乱妇高清无乱码| 日本不卡网站| 亚洲自拍欧美色图| 国产videos久久| 肉大捧一出免费观看网站在线播放| 99在线精品免费视频九九视| 免费一区二区三区在线观看| 高清不卡一二三区| 日韩不卡av在线| 亚洲不卡在线观看| 亚洲一级视频在线观看| 亚洲国产日韩欧美在线图片| 亚洲乱亚洲乱妇| **欧美日韩vr在线| 香蕉成人app| 亚洲一一在线| 亚洲一区日本| 天堂va欧美va亚洲va老司机| 国产午夜精品一区二区| 国产精品18p| 91精品免费观看| 国产毛片av在线| 欧美激情成人在线视频| 日韩国产91| 日韩欧美亚洲日产国| 影音先锋亚洲一区| 污免费在线观看| 国产精品乱码人人做人人爱 | 精品国内二区三区| 1024视频在线| 日本欧美在线视频| 国产精品99久久免费观看| 黄色高清视频网站| 日韩激情一二三区| 大又大又粗又硬又爽少妇毛片| 亚洲一区中文日韩| va视频在线观看| 久久久国产精品x99av| 国产精品久久久久久久久免费高清 | 国产亚洲欧美一区二区| 亚洲成av人电影| 色乱码一区二区三区在线| 久久久精品国产免大香伊| 精品在线播放视频| 精品国产一区二区三区久久影院| av网站大全在线| 亚洲精品日产aⅴ| 天天做天天爱天天综合网| www.超碰97.com| 中文字幕在线观看一区| 91麻豆成人精品国产| 中文字幕一区电影| 成人精品高清在线视频| 手机看片福利永久国产日韩| 日本特黄久久久高潮| 人人妻人人澡人人爽| 91九色最新地址| 国产高清视频免费最新在线| 国产精品久久久久久久天堂| 精品视频免费| 天天影视综合色| 国产精品亲子伦对白| 影音先锋国产资源| 日韩中文字幕在线免费观看| 国产精品久久久久久久久久齐齐| 亚洲免费视频一区| 极品少妇xxxx精品少妇偷拍| 久久久久久久麻豆| 欧美一级精品大片| 国产美女情趣调教h一区二区| 狠狠综合久久av| 久久精品二区三区| 日本不卡一区视频| 日韩亚洲欧美成人一区| 啦啦啦中文在线观看日本| 国产综合色一区二区三区| 国产精品一卡| 亚洲一二三精品| 3d动漫精品啪啪一区二区竹菊| 先锋影音在线资源站91| 国产在线精品二区| 肉色丝袜一区二区| 多男操一女视频| 亚洲丁香久久久| 欧美大胆成人| 日韩视频在线观看视频| 国产+成+人+亚洲欧洲自线| 久久久久女人精品毛片九一| 中文字幕精品视频| 我要色综合中文字幕| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 久久精品一区二区三区四区| 国产又大又黑又粗| 亚州av一区二区| 久久在线播放| 91传媒理伦片在线观看| 在线视频一区二区三区| 久cao在线| 精品日韩美女| 激情综合色播激情啊| 日韩欧美亚洲国产| 中文字幕无线精品亚洲乱码一区| 香蕉大人久久国产成人av| 99精品视频播放| 最新国产精品久久精品| 色天堂在线视频| 91久久久精品| 亚洲男女自偷自拍| 欧美极品aaaaabbbbb| 亚洲欧美日韩天堂| 亚洲一区二区免费在线观看| 色一情一乱一伦一区二区三区日本| 一区二区三区在线视频免费| 户外极限露出调教在线视频| 超碰在线观看97| 蜜臀av性久久久久蜜臀aⅴ四虎|