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

深入理解Android圖形系統

移動開發 Android
Android是目前最流行的移動操作系統之一,我們今天就來具體分析一下Android的圖形系統。

一、圖形系統簡介

圖形系統是計算機中最重要的子系統之一。我們平時使用的電腦、手機都是圖形界面的。對于普通人來說,沒有圖形界面的計算機幾乎是沒法用的,今天我們就來講一講圖形系統背后的原理。

1.1 圖形系統的誕生

早期的計算機是沒有圖形界面的,都是命令行界面。大家坐在終端前面輸入命令、執行命令、等待命令完成,如此循環往復。這樣的計算機比較適合科研人員、理工男使用,但是想要普及到千家萬戶是不可能的。后來施樂公司帕克研究中心(Xerox Palo Alto Research Center,Xerox PARC)率先研究出了圖形界面的計算機,提出了WIMP的概念。WIMP就是Window(窗口)、Icon(圖標)、Menu(菜單)、Pointer(指針/鼠標)。我們現在的計算機仍然是WIMP模式的。可惜施樂公司并沒有把圖形界面的計算機做起來,而是被喬布斯和比爾蓋茨發揚光大了。喬布斯去參觀帕克研究中心的時候,被他們所展示的圖形界面驚呆了,回去之后立馬在自己公司做起了圖形界面的操作系統。比爾蓋茨發現蘋果的圖形界面確實不錯,也開始自己做圖形界面,于是便有了Windows系統。后來蘋果和微軟因為圖形界面的問題還打起了官司。

1.2 圖形系統的總體結構

圖形模式與命令行模式相比,編程模式和軟件結構都發生了很大的變化。在命令行模式的時候,程序員只需要考慮程序本身的流程,然后通過標準輸入輸出和終端打交道就可以了。但是到了圖形模式的時候,一切都變了。程序員首先要考慮是如何繪制程序的界面,然后再通過消息循環對程序的點擊等各種事件進行處理。不僅程序員編程的模式變了,操作系統實現的方式也發生了很大的變化。命令行模式下,操作系統只需要提供一個shell,shell不斷地讀取命令、執行命令就可以了。但是在圖形模式下,操作系統首先要提供一個桌面,作為用戶使用電腦的起點,還要提供文件管理器,方便用戶查看管理文件。對程序員來說,操作系統還要提供圖形編程接口,提供渲染庫,還要負責對所有的窗口進行合成和顯示。于是在操作系統里面便誕生了一個重要又龐大的子系統,圖形系統。根據前面幾句的描述,我們先來看一下圖形系統的簡單結構。

圖片

 可以看到圖形系統的總體結構還挺簡單的,GUI進程需要窗口系統來創建和管理窗口,需要渲染系統來幫忙繪制界面,最后讓顯示系統把畫面顯示到顯示器上。

1.3 圖形系統的各層職能

知道了圖形系統的總體結構,我們再來詳細描述一下各層的職能。

窗口系統一般以進程的方式運行在用戶空間,我們把它的進程叫做DisplayServer。窗口系統有兩個職責:一是窗口管理器,負責窗口的創建、縮放、銷毀等工作;二是合成管理器,負責把各個GUI進程繪制完成之后的窗口合成為一個位圖,然后送到顯示系統去顯示。

渲染系統是以so庫的形式存在,被加載到每個GUI進程的內存空間中。渲染系統負責執行GUI進程的繪制命令,在窗口的顯示Buffer上生成相應的位圖。渲染分為2D渲染和3D渲染,2D渲染一般用CPU來執行,3D渲染一般用GPU來執行。但是現在經常也將2D渲染用GPU來做。不過很多普通程序并不是直接使用渲染庫的,而是使用的控件庫,因為直接使用渲染庫太麻煩了。比如我們要畫一個按鈕,用渲染庫API來畫的話是非常麻煩的,但是使用控件庫API的話,我們只需要指定位置、大小、樣式等屬性就可以輕松畫一個按鈕。

顯示系統是以驅動的形式存在于內核中,驅動是屏幕控制器的驅動或者DPU的驅動。顯示系統的作用就是把所有窗口形成的一個位圖在顯示器上顯示。早期的顯示驅動模型是FBDEV,它針對的是屏幕控制器,屏幕控制器沒有運算能力,只能接收窗口系統已經合成好的位圖來顯示。此時窗口系統的合成管理器會使用渲染系統來合成各個窗口的位圖,合成也可以看出是一種特殊的渲染。后來屏幕控制器逐漸發展成了DPU,具有了運算能力,能進行合成操作。此時也誕生了新的顯示驅動模型DRM,DRM允許窗口系統不進行合成操作,而是把各個窗口的顯存都發給自己,通過DPU進行合成操作,然后再送到顯示器顯示。

二、安卓圖形系統

Android是目前最流行的移動操作系統之一,我們今天就來具體分析一下Android的圖形系統。

2.1 框架概覽

在講Android之前,我們先來看一下Linux發行版的圖形系統。由于Android的內核也是Linux,所以它們的顯示系統是一樣的。Linux的渲染系統用的是OpenGL,以及最新的Vulkan,控件庫用的是GTK(GNOME)或者Qt(KDE)。Linux的窗口系統歷史悠久且復雜,可以追述到UNIX時代。這里我們就不展開說了,我們直接說現狀。在Linux上,窗口系統的協議和實現是明確分開的,Linux長期使用的窗口協議叫做X Window,實現是X.org。不過由于X Window太過古老,很多設計都不符合現狀的情況,還有沉重的歷史包袱。因此有人設計了新的窗口的協議Wayland,Wayland最流行的實現叫做Weston。現在大部分Linux發行版已經開始轉向Wayland/Weston了。

了解了Linux發行版的圖形體系,我們再來看一下Android的圖形體系。

圖片

Android的圖形系統并沒有明確的協議,實現既協議。這是因為Linux系統是標準的開源系統,很多事情都喜歡先定個協議,然后誰都可以實現這個協議。而Android雖然也開源,但是它是由谷歌直接實現的,其它廠商拿來用,所以沒有必要定個協議。Android的圖形系統在具體細節上和Linux的圖形系統差別還是很大的,這是因為Linux圖形系統面向的是桌面系統,Android圖形系統面向的是移動系統,兩者的使用環境不同,開發環境不同,導致了具體的實現細節也不相同。其中一個最大的不同就是Android圖形系統中沒有典型的窗口概念。在其它窗口系統中,一般都會有個CreateWindow的接口用來創建一個窗口,返回值是窗口句柄,然后我們就可以用這個窗口句柄來做其它事了。但是在Android中,不是這樣的邏輯,窗口的概念被隱藏并分散在具體的實現中去了,程序員面對的是Activity和View、ViewGroup。下面幾個小節會對Android圖形系統的各個部分進行介紹。

2.2 渲染系統概覽

Android中一開始用的是OpenGL ES進行3D渲染,用skia進行2D 軟件渲染。后來為了優化2D渲染,開發了hwui進行硬件渲染,hwui是對OpenGL ES的封裝。再后來變成了hwui調用skia,skia對OpenGL ES進行了封裝來進行硬件渲染,當然skia也保留了軟件渲染部分。下面我們看一下圖。

圖片

OpenGL ES system warpper是系統提供的標準接口庫,它的so位置是固定的,方便程序加載,其接口是標準規定的接口,方便程序使用。不過它本身沒有任何實現邏輯,所有的實現邏輯都在GPU廠商提供的不開源的庫里面。

普通APK并不會直接使用這些渲染庫,而是使用的系統提供的控件庫。Android提供的控件大部分都在package android.view 和android.widget中。

2.3 窗口系統概覽

窗口系統有兩個職責,窗口管理器和合成管理器。在Android中這兩者并不在一起,窗口管理器是在system_server進程中實現,名字叫做WindowManagerService(WMS),是用Java語言實現的,因為system_server就是Java進程。Android為什么要把WindowManagerService放在system_server中實現呢?這是system_server中有ActivityManagerService(AMS),兩者的關系比較密切,放在一起比較合適。合成管理器是在一個獨立進程中實現的,叫做SurfaceFlinger。最開始的時候SurfaceFlinger是直接進行合成的,后來由于硬件合成的興起,SurfaceFlinger不再直接進行合成操作了,而是把合成操作轉發給底層。WindowManagerService和SurfaceFlinger之間使用Binder進程間通信來交互。下面我們來看一下圖:

圖片

谷歌推出了叫做HWC(硬件合成器)的模塊,用來處理硬件合成。剛開始的時候HWC只是個so庫,運行在SurfaceFlinger進程中,后來HWC獨立成單獨的進程了。在HWC中有很多廠商提供的不開源和半開源的庫。

這個圖里面沒有畫和APK之間的交互。窗口系統和APK之間的交互有兩部分,一是程序在創建Activity的時候會和WMS交互來創建窗口。Android里面沒有典型的窗口概念,可以把PhoneWindow、DecorView、ViewRootImpl、Surface糅合在一起當做窗口的概念。還有一部分沒有畫,是APK的渲染與SurfaceFlinger合成之間的生產者消費者關系,這個邏輯在下一章里講。

想要深入地學習AMS,推薦閱讀老羅的Android之旅中的WMS篇:https://blog.csdn.net/Luoshengyang/article/details/8462738

,以及袁輝輝寫的WMS分析:http://gityuan.com/2017/01/08/windowmanger/

2.4 顯示系統概覽

顯示系統直接和屏幕相關,屬于內核里的驅動。內核一般對任一類型的硬件都會有個驅動模型,所有的硬件廠商都在這個硬件模型上開發驅動。最早對顯示器抽象出來的驅動模型加做FBDEV,后來隨著硬件和軟件的發展,又誕生了新的驅動模型DRM?,F在大部分系統都轉向DRM了,所有我們這里講一下DRM。先畫個圖看一下:

圖片

這個結構其實也是很多驅動的結構。內核定義并實現了DRM Core,硬件廠商按照DRM Core的要求擴展結構體,實現函數指針,然后調用注冊函數注冊自己。在用戶空間使用的硬件會創建一個設備文件,用戶空間可以open設備文件,用ioctl來調用各種命令,ioctl的命令是Core定義好的,具體的驅動要去實現這些命令。用戶空間直接使用ioctl命令還是比較麻煩的,所以還會有一個libdrm庫,用來封裝各種ioctl命令,轉化為函數接口,這樣進程使用就比較方便了。

三、生產者消費者模型

在講渲染與合成之前,我們先來講一講它們之間的關系以及它們交互的流程。

3.1 概覽

渲染與合成是生產者消費者關系,那么它們之間是怎么交互的呢?Android實現了一個生產者消費者模型BufferQueue,生成者與消費者通過BufferQueue來交互。BufferQueue管理的是GraphicBuffer,生產者渲染的內容要放到GraphicBuffer上,消費者合成內容的來源來自GraphicBuffer。GraphicBuffer通過谷歌定義的Hidl接口Gralloc來分配內存,Gralloc又通過ION分配內存。ION是建立在DMA-BUF的基礎之上的跨空間跨設備的內存分配方法。為了加快生成消費的流程,BufferQueue可以采取異步的模式,異步的時候就需要進行步調同步了,為此采取的辦法是Fence。Fence是一種跨空間跨設備的同步機制??缈臻g的意思是指進程與進程之間、內核與用戶空間之間,跨設備指的是兩個設備的驅動之間或者驅動與進程之間。下面我們畫個圖看一下它們的總體關系。

圖片

3.2 BufferQueue

BufferQueue是Android中對渲染與合成這一對生產消費關系模型的實現。我們先來看BufferQueue的使用方法。

void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
sp<IGraphicBufferConsumer>* outConsumer)
{
sp<BufferQueueCore> core(new BufferQueueCore());
sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core));
sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));
*outProducer = producer;
*outConsumer = consumer;
}

可以看到創建一個BufferQueue就是創建一個BufferQueueCore,然后以這個core為參數分別創建生產者基礎接口和消費者基礎接口。一般情況下都是在消費者進程中創建的BufferQueue,然后把生產者接口用Binder跨進程傳遞給生產者進程。當然也可以反過來,也可以兩者都跨進程,也可以兩者都不跨進程。之所以大部分情況下選擇在消費者進程中創建BufferQueue,是為了想讓消費者準備好,然后生產者一生成就可以立馬得到消費了。

一般情況下我們并不會直接使用原始的生產者或者消費者接口,而是會對它們進行層層封裝,封裝之后的接口就比較方便使用了。下面我們看一下它的封裝邏輯圖。

圖片

 這個圖畫的是APK與SurfaceFlinger對BufferQueue的使用情況??梢钥吹綄υ忌a者接口的封裝一般都是Surface,但是我們也會經常在代碼中看到SurfaceControl,這是怎么回事呢?這是為了完成控制權與繪制權的分離。APK啟動的時候會去請求WMS創建窗口也就是Surface,WMS再去請求SurfaceFlinger創建BufferQueue,并獲得其原始生產者接口。WMS自身把原始生產者封裝為SurfaceControl,以便對Surface進行控制。然后又把原始生產者封裝為Surface傳遞給APK,這樣APK就只有繪制權了。APK如果想設置Surface的屬性,還得請求WMS的幫忙。下面畫個圖看一下:

圖片

 下面我們再看一下BufferQueue的內部管理邏輯。BufferQueue管理的是GraphicBuffer,但又不是直接管理的GraphicBuffer,而是定義了BufferSlot結構體。BufferSlot包含對GraphicBuffer的智能指針應用和對Fence的智能指針引用,以及BufferState。BufferQueueCore包含一個BufferSlot的數組,有64個元素,由于BufferSlot內部都是智能指針引用,所以它一開始都是空的,只有用到了才會分配。BufferQueue在管理BufferSlot的時候并不會直接去操作它們,而是會管理它們的下標。下面我們畫個圖看一下。

圖片

 BufferQueue用4個整數容器來管理BufferSlot,BufferSlot的下標放在不同的容器中有不同的含義。首先是BufferQueue硬編碼定義的64是all slots,當創建BufferQueue之后我們可以使用接口函數來設置我們要用多少個Buffer,不用的下標就會被放置在容器mUnusedSlots中,使用的下標就會被放置在容器mFreeSlots中。然后當我們使用某個Buffer的時候,無論是生產者使用還是消費者使用,都會把它的下標放入容器mActiveBuffers中去。當消費者使用完一個Buffer的時候又會把它放入容器mFreeBuffers中去。mFreeBuffers和mFreeSlots的區別是前者的BufferSlot已經關聯上GraphicBuffer了,而后者僅僅是一個空的slot。Buffer的狀態變遷我們在3.4節中講。

3.3 顯存分配與同步

當我們第一次使用BufferSlot的時候就會去分配GraphicBuffer,那么GraphicBuffer又是怎么樣分配內存的呢?GraphicBuffer會通過谷歌定義的Gralloc接口來分配內存。Gralloc接口又是通過兩個Hidl接口IAllocator和IMapper來實現的。下面我們畫圖來看一下。

圖片

圖片

可以看到最終分配內存的方法是ION。ION是一種跨空間跨設備的內存分配方法,ION是基于DMA-BUF的,我們先來說一下DMA-BUF。

DMA-BUF是一種跨空間跨設備的內存共享機制,它僅僅是一個框架,并不能分配內存。DMA-BUF既不是DMA也不是BUF,而是Sharing。DMA-BUF定義了兩個角色:Exporter(導出者),負責分配內存,一個體系中只能存在一個導入者;Importer(導入者),也叫User,負責使用內存,可以有N個,一般有兩個,一個寫,既生產者,一個讀,既消費者。下面我們畫圖來看一下:

圖片

 明白了DMA-BUF,我們再來看一下ION。ION是建立在DMA-BUF的基礎之上的,ION能夠在進程之間、進程和內核之間、設備之間共享內存都歸功于DMA-BUF。ION自身有許多heap,不同的heap用來分配不同類型的內存,ION默認使用system heap。內核里的代碼可以直接使用ION的接口,為了讓用戶空間也能使用ION,ION創建了一個設備文件/dev/ion。用戶空間可以用各種ioctl命令來使用ION,顯然這不太方便,于是產生了libion來幫助大家方便地使用ION。總結一下,如下圖所示:

圖片

GraphicBuffer的內存分配完成之后,就可以用來渲染和合成了。但是我們現在只能進行同步操作,而GPU的渲染是異步,為了能提高性能,我們需要一種異步使用下的等待通知機制。為此內核中實現了Fence,它主要是給DMA-BUF用的,所以它也是一種跨空間跨設備的機制。因此,Fence是一種跨設備跨空間的wait/notify機制,它和Java中的wait/notify、C++中條件變量的wait/signal的語義是一樣的,不同的是,Java、C++中的機制只能在進程內使用。Fence還有一個很大的特點就是它的notify信號不會丟失,這是因為Fence是一次性的,用完就扔,每次使用都需要重新申請一個,不能復用,因此Fence都是有編號的。Fence不僅有編號,還有context,不同的場景都可以創建context。同一個context下的fence編號是有可比較性的,編號小的時間在前。不同context下的fence編號不具有可比較性。下面我們畫圖來看一下。

圖片

3.4 生產消費流程

明白了前面的知識之后,我們就要來看一看生產消費的具體流程了。我們先來看一下BufferSlot的狀態變遷,BufferSlot的狀態變化是和生產消費的流程相關的。我們先看圖再來解說。

圖片

一個BufferSlot最初是處于Free狀態的,當生產者準備生產的時候,會先dequeueBuffer,此時就會得到BufferSlot,BufferSlot的狀態也會變為Dequeued。得到的BufferSlot如果之前是空的slot,就會去分配內存,流程在上一節中說過了,如果是已經分配內存的slot則直接使用。然后生產者開始生產,把生產的內存都放到GraphicBuffer中去。當生產完成時就會調用queueBuffer,以告訴消費者我生產完了,你可以開始消費了。queueBuffer之后,BufferSlot的狀態就由Dequeue轉變為Queued。此時的GraphicBuffer會被封裝為一個BufferItem結構體,放入mQueue隊列中。消費者得到消息后就要準備消費了。消費者先acquireBuffer,從mQueue隊列中獲取一個BufferItem,其對應的BufferSlot的狀態就轉化為Acquired了。然后消費者就可以開始消費了,當消費完成的時候,會調用releaseBuffer表明自己消費完成,把BufferSlot還給BufferQueue,此時BufferSlot的狀態就回歸Free了。

明白了BufferSlot的狀態變化以及生成消費的基本流程之后,我們再來看一下,在VSync下,在有Fence的情況下,生成消費的流程。我們先看圖:

圖片

首先渲染和合成是兩個獨立的線程,兩者是同時進行的,雙方都是在收到VSync信號時開始執行的。其次渲染和合成都分別有一個額外的線程來進行異步渲染與合成,不會阻塞主流線程。主流線程沒有阻塞操作,不會卡住,兩個異步線程都在等Fence信號,有可能會卡住。當某個異步線程一直卡住的時候,比如說合成線程卡住了,會導致渲染線程一直在wait Fence信號也會卡住,但是主線程還能繼續運行。

四、總結回顧 

通過本文我們對Android的圖形系統有了基本的了解,對圖形渲染與合成這一對生產者消費者模型也有了大概的認知。下面讓我們看圖再來回顧一下:

圖片

圖形系統由渲染系統、窗口系統、顯示系統三部分組成,渲染系統負責幫助GUI進程實現界面的繪制,窗口系統負責為GUI進程分配窗口、管理窗口并對所有的Surface進行合成,顯示系統負責把合成的畫面送到顯示器里去顯示?,F在硬件合成比較流行,窗口系統都是把圖形合成的任務交給顯示系統通過硬件來完成。

參考文獻:

https://blog.csdn.net/hexiaolong2009/category_9281458.html

https://blog.csdn.net/hexiaolong2009/category_9705063.html

https://blog.csdn.net/hexiaolong2009/category_10331964.html

http://www.wowotech.net/sort/graphic_subsystem

作者簡介:

程磊,某手機大廠系統開發工程師,閱碼場榮譽總編輯,最大的愛好是鉆研Linux內核基本原理。

責任編輯:武曉燕 來源: Linux閱碼場
相關推薦

2023-02-10 08:11:43

Linux系統調用

2025-10-28 04:25:00

2011-04-28 11:01:40

Android消息處理LooperHandler

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2018-04-16 11:04:23

HBaseRegion Serv數據庫

2017-05-03 17:00:16

Android渲染機制

2022-10-11 07:43:34

AndroidSyncGradle 構建

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構開發運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-01-10 08:48:21

2020-09-23 10:00:26

Redis數據庫命令

2025-06-05 05:51:33

2024-02-21 21:14:20

編程語言開發Golang

2019-06-25 10:32:19

UDP編程通信
點贊
收藏

51CTO技術棧公眾號

精品一区二区三区蜜桃在线| 久久av综合网| 一级黄色免费看| 欧美日一区二区三区在线观看国产免| 精品国产99国产精品| 日本阿v视频在线观看| 黄色在线网站| 狠狠色丁香婷婷综合| 久久这里只有精品99| a级一a一级在线观看| 国产乱子精品一区二区在线观看| 艳女tv在线观看国产一区| 欧美成人一区二区三区| 国产午夜伦鲁鲁| 免费日本一区二区三区视频| 成人动漫视频在线| 国产精品美女www爽爽爽视频| 少妇被躁爽到高潮无码文| 日本亚洲不卡| 欧美一级日韩免费不卡| www.国产区| 黄页在线观看免费| 国产精品久久毛片av大全日韩| 97久久国产精品| 国产精品区在线| 2021中文字幕在线| 亚洲人成精品久久久久久 | 天天操天天干天天玩| 日韩国产福利| 成人毛片视频在线观看| 成人免费视频在线观看超级碰| 狠狠人妻久久久久久综合蜜桃| 成人直播在线| 日本一区二区三区视频视频| 精品乱色一区二区中文字幕| 精品人妻在线播放| 精品盗摄女厕tp美女嘘嘘| 亚洲精品在线三区| 1314成人网| 久久三级毛片| 欧美主播一区二区三区| 18禁免费无码无遮挡不卡网站| www.久久久久.com| 国产精品二三区| 亚洲开发第一视频在线播放| 在线观看国产区| 999亚洲国产精| 欧美激情精品在线| 中文字幕av免费在线观看| 久久国产精品亚洲人一区二区三区 | 欧美xxxx做受欧美.88| 亚洲熟女少妇一区二区| 欧美色女视频| 色多多国产成人永久免费网站| 好吊视频在线观看| 国产精品亚洲二区| 国产亚洲精品91在线| 成人免费无遮挡无码黄漫视频| 天海翼精品一区二区三区| 亚洲国产高清福利视频| 老太脱裤让老头玩ⅹxxxx| 四虎av在线| 不卡的av电影在线观看| 国产精品免费在线| 人妻一区二区三区四区| zzijzzij亚洲日本少妇熟睡| 国产美女精品久久久| 日韩一区二区三区不卡| av在线不卡电影| 久久久久久九九九九| 蜜芽tv福利在线视频| 国产欧美日韩在线| 一本一道久久a久久精品综合 | 久热爱精品视频线路一| 日本精品人妻无码77777| 欧美激情综合| 26uuu日韩精品一区二区| 精品人妻一区二区三区免费看| 日韩在线卡一卡二| 精品国产一区久久久| 国产黄色小视频网站| 日韩美女毛片| 亚洲网在线观看| 国产人与禽zoz0性伦| 午夜国产精品视频| 91禁外国网站| 一级黄色在线观看| 国产一区二区女| 久久精品国产综合精品| av中文字幕在线| 亚洲综合一区在线| 精品视频一区二区在线| 亚洲欧洲专区| 色婷婷精品久久二区二区蜜臀av| 日韩一级片播放| 国产精品免费精品自在线观看| 精品国产乱码久久久久久浪潮| 性欧美丰满熟妇xxxx性仙踪林| 久久国产精品亚洲人一区二区三区| 欧美激情亚洲另类| 无码久久精品国产亚洲av影片| 国产麻豆9l精品三级站| 免费一区二区三区| gogo在线高清视频| 欧洲精品一区二区| 亚洲精品激情视频| 成人羞羞视频播放网站| 久久久女女女女999久久| 国产精品尤物视频| 成人18精品视频| 在线观看一区欧美| 毛片免费看不卡网站| 日韩免费视频一区| 日本高清黄色片| 国产精品一国产精品k频道56| 国产日韩精品在线播放| 欧美在线一卡| 亚洲国产成人高清精品| 日韩中文在线不卡| theporn国产精品| 亚洲女娇小黑人粗硬| 久久精品久久久久电影| 我看黄色一级片| 2024最新电影免费在线观看| 国产精品久久久久久户外露出| 777精品久无码人妻蜜桃| 国产精品亚洲欧美日韩一区在线| 国产小视频国产精品| 国产午夜视频在线播放| 国产一区二区三区免费看| 日韩精品在在线一区二区中文| av日韩中文| 日韩女优av电影在线观看| 永久免费看片直接| 日本亚洲视频在线| 蜜桃免费一区二区三区| 电影k8一区二区三区久久| 5858s免费视频成人| 久久久久亚洲av无码a片| 亚洲男人影院| 精品一区二区不卡| heyzo高清国产精品| 日韩三级av在线播放| h色网站在线观看| 开心九九激情九九欧美日韩精美视频电影 | 日本在线观看中文字幕| 国产成人精品午夜视频免费| 日本精品免费视频| 国产精品高清一区二区| xvideos亚洲| 国产一级精品毛片| 欧美国产综合色视频| 亚洲最大综合网| 日韩一区欧美| 91在线网站视频| 在线中文字幕-区二区三区四区| 欧美一区二区三区视频免费播放| 2025国产精品自拍| 久久9热精品视频| 熟女视频一区二区三区| 深夜激情久久| 97国产一区二区精品久久呦 | 在线观看欧美日韩| 熟女少妇内射日韩亚洲| 爽好久久久欧美精品| 日本亚洲欧洲精品| 国产成人77亚洲精品www| 中文字幕亚洲色图| 国产美女自慰在线观看| 亚洲激情av在线| www.com日本| 新67194成人永久网站| 日韩欧美一区二区视频在线播放| 精品久久在线| 欧美第一页在线| 亚洲色图欧美视频| 欧美性大战xxxxx久久久| 国产精品白丝喷水在线观看| 成人性视频网站| 不卡影院一区二区| 国产精品国产一区| 国产伦精品一区二区三区四区免费 | 少妇丰满尤物大尺度写真| 青青草这里只有精品| 日本一区二区不卡| 毛片在线播放a| 亚洲成在人线av| 久久久久精彩视频| 亚洲一区中文在线| 老熟妇一区二区| 国产精品亚洲а∨天堂免在线| 成 年 人 黄 色 大 片大 全| av永久不卡| 国产厕所精品在线观看| 一级毛片久久久| 美女啪啪无遮挡免费久久网站| 农村少妇久久久久久久| 欧美三区免费完整视频在线观看| 国产一区二区视频在线观看免费| 99精品国产91久久久久久| a在线观看免费视频| 亚洲日本成人| 只有这里有精品| 国产一区毛片| 国产一区二区免费电影| 精品久久99| 欧美在线视频网| 牛牛电影国产一区二区| 尤物九九久久国产精品的特点 | 女人床在线观看| 你懂的一区二区三区| 国内免费久久久久久久久久久| 国产区高清在线| 亚洲国产成人久久| 国产视频一二三四区| 在线观看一区二区精品视频| 伊人365影院| 成人午夜av影视| 亚洲综合色在线观看| 国产精品一卡| 欧美视频免费看欧美视频| 91精品福利| 亚洲黄色一区二区三区| 九九热精品视频在线观看| 成人免费视频视频在| 国产精品一区二区三区av| 国产精品欧美久久久| 最新日韩精品| 2019av中文字幕| √8天堂资源地址中文在线| 麻豆国产va免费精品高清在线| www视频在线观看免费| 亚洲男人天堂网| 无码人妻精品一区二区三区9厂| 久久男人中文字幕资源站| 国产成人亚洲精品无码h在线| 红桃视频国产精品| 国产a级黄色大片| 911久久香蕉国产线看观看| 亚洲欧洲一区二区| 欧美中文一区二区| 日韩视频精品| 欧美精选视频在线观看| 久久er99热精品一区二区三区 | 日本一区视频在线播放| 欧美尿孔扩张虐视频| 国产免费一区二区三区| 99精品在免费线中文字幕网站一区| 亚洲伊人第一页| 日韩欧美中文在线观看| 亚洲影院色无极综合| 精品国产18久久久久久二百| 亚洲一区二区三区视频播放| 国产精品视频首页| 91在线免费看片| 亚洲高清在线一区| 国产欧美欧洲| 欧美黑白配在线| 欧美黄色直播| 大片网站久久| 在线无限看免费粉色视频| 91精品国产视频| 免费看日本黄色| 亚洲精品乱码| 久久黄色免费看| 精品一区二区免费| 精产国品一区二区三区| 成人午夜激情在线| 中文字幕在线观看网址| 国产午夜亚洲精品羞羞网站| 手机av在线不卡| 亚洲男同性恋视频| 五月天婷婷网站| 一道本成人在线| 一级特黄aaa大片在线观看| 欧美一区二区三区视频免费播放| 丁香花免费高清完整在线播放| 欧美精品一区二区三区蜜臀| 亚洲aⅴ在线观看| 综合久久五月天| 美足av综合网| 国产成人午夜视频网址| 欧美男男video| 97成人精品视频在线观看| 欧美国产日韩电影| 999视频在线免费观看| 亚洲黄色录像| 好色先生视频污| 国产精品日本| 亚洲综合20p| 99视频精品免费视频| 美国精品一区二区| 午夜一区二区三区视频| 国产裸体美女永久免费无遮挡| 日韩精品在线看片z| 国产玉足榨精视频在线观看| 欧美大片va欧美在线播放| 在线观看欧美日韩电影| 亚洲一区二区三区视频| 加勒比久久综合| 国产免费黄色一级片| 久久国产精品区| 精品人妻一区二区三区日产乱码卜| 国产精品国产三级国产有无不卡 | 粉嫩一区二区三区国产精品| 九九热这里只有在线精品视| 五月天婷婷在线视频| 久久久久亚洲精品国产| 日韩欧美三区| 欧美日韩电影一区二区| 国产在线日韩| 亚洲天堂国产视频| 久久久久久久综合日本| 中文字幕狠狠干| 亚洲精品伦理在线| 国产精品成人久久久| 日韩av在线免费观看| 天堂av中文字幕| 日韩av在线免播放器| 哥也色在线视频| 国产精品va在线播放| 久久精品66| 欧美连裤袜在线视频| 欧美午夜一区| 欧美日韩理论片| 国产精品系列在线| 男人天堂2024| 精品亚洲一区二区三区在线观看 | 欧美日韩国产中文字幕| 精品国产无码一区二区三区| www.xxxx欧美| 国产成人77亚洲精品www| 四虎一区二区| 青娱乐精品视频| 亚洲精品国产精品国自产网站| 性感美女久久精品| 国产成人无码www免费视频播放| 久久成人人人人精品欧| 国产电影一区二区| 在线观看亚洲视频啊啊啊啊| 久久成人免费网站| 美女福利视频网| 欧美久久高跟鞋激| 巨大荫蒂视频欧美另类大| 国产精品网站入口| 青青草国产成人a∨下载安卓| 欧美 日韩 国产 激情| 国产亚洲综合av| 免费一级a毛片| 色偷偷偷综合中文字幕;dd| 久久人人视频| 最近中文字幕免费mv| 国产一区二区三区免费观看| 欧美精品色哟哟| 精品日本高清在线播放| 日本加勒比一区| 69av在线视频| 国产欧美日韩精品高清二区综合区| 久久国产乱子伦免费精品| 久久久午夜精品理论片中文字幕| 黄色免费av网站| 一区二区三区精品99久久| 日本欧美在线| 国产激情片在线观看| 成人网男人的天堂| 日韩精品1区2区| 国产一区二区三区在线观看网站| 主播大秀视频在线观看一区二区| 一区二区三区在线视频看| 国产精品影视天天线| 国产香蕉在线视频| 亚洲欧美国内爽妇网| 国产福利亚洲| 999久久欧美人妻一区二区| 成人高清在线视频| 亚洲欧美偷拍一区| 久久精品亚洲94久久精品| ccyy激情综合| 情侣黄网站免费看| 亚洲欧洲www| 日韩精品在线观看免费| 国产香蕉一区二区三区在线视频| 国产美女精品视频免费播放软件| av网站手机在线观看| 国产色91在线| 国内老熟妇对白xxxxhd| 欧美在线视频免费观看| 午夜av一区| 无码人妻精品一区二区三区温州| 欧美这里有精品| 欧美xxxx黑人又粗又长| 美媛馆国产精品一区二区| 精久久久久久久久久久| 可以免费看的av毛片| www.xxxx欧美| 国产精品欧美日韩一区| 香蕉视频免费网站| 欧美日韩中字一区| 九九色在线视频| 日韩在线导航|