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

Android字體渲染器:使用OpenGL ES進(jìn)行高效文字渲染

移動(dòng)開發(fā) Android
任何有多年客戶端開發(fā)經(jīng)驗(yàn)的開發(fā)者都應(yīng)該知道復(fù)雜的文字渲染是怎么工作的。至少在2010年以前,我剛開始寫libhwui的時(shí)候,我就意識(shí)到處理文字有時(shí)會(huì)比其他方面更復(fù)雜,特別是當(dāng)你嘗試用GPU在屏幕上進(jìn)行繪制的時(shí)候。本文只是對(duì)Android的字體渲染器進(jìn)行簡(jiǎn)單介紹,還有很多實(shí)現(xiàn)的細(xì)節(jié)沒有考慮到,或者很多問題以后會(huì)說明。

任何有多年客戶端開發(fā)經(jīng)驗(yàn)的開發(fā)者都應(yīng)該知道復(fù)雜的文字渲染是怎么工作的。至少在2010年以前,我剛開始寫libhwui的時(shí)候(這是一個(gè)基于 Android2.0的2D繪畫庫(kù)),我就意識(shí)到處理文字有時(shí)會(huì)比其他方面更復(fù)雜,特別是當(dāng)你嘗試用GPU在屏幕上進(jìn)行繪制的時(shí)候。

文字與Android

Android上的文字渲染加速器硬件最初是由Renderscript團(tuán)隊(duì)寫的,然后被很多工程師改進(jìn)和優(yōu)化,包括我和好友Chet Haase。在網(wǎng)絡(luò)上,可以很容易找到很多關(guān)于怎么使用OpenGL ES渲染文字的教程。如果覺得還不夠,可以看看關(guān)于游戲的文章,只看關(guān)于文字渲染部分就行。

本文說不是很新奇的知識(shí),只是對(duì)于很多開發(fā)者來說,通過本文可以從深層次上了解如何實(shí)現(xiàn)一個(gè)基于GPU的文字渲染系統(tǒng),文章***還介紹了一些比較容易實(shí)現(xiàn)的優(yōu)化方法。

用OpenGL渲染文字的常用方法是計(jì)算包含所需字形的所有紋理集。這個(gè)操作通常是使用一些相當(dāng)復(fù)雜的算法進(jìn)行離線操作,這樣可以在構(gòu)造字形的時(shí)候更加高效。在創(chuàng)建這樣一個(gè)紋理集之前,首先需要知道應(yīng)用程序在運(yùn)行時(shí)要使用的字體,包括字體樣式、大小以及其它屬性。

在Android上,提前進(jìn)行字體紋理生成不是一個(gè)實(shí)用的方案。Android上的UI工具并不能知道應(yīng)用系統(tǒng)會(huì)使用什么字體和字形,并且應(yīng)用還可以在運(yùn)行時(shí)載入自定義的字體,這是主要的限制。Android字體渲染還必須遵循以下條例:

  • 它必須在運(yùn)行時(shí)建立字體緩存;
  • 它必須能夠處理大量的字體;
  • 它必須可以處理大量的符號(hào);
  • 它必須要盡可能減少字體上的資源消耗;
  • 必須運(yùn)行要快速;
  • 在低端和高端機(jī)器上也能夠良好運(yùn)行;
  • 能***與其它組件結(jié)合(驅(qū)動(dòng)程序或GPU)。

字體渲染器的實(shí)現(xiàn)

在進(jìn)入底層OpenGL字體渲染器工作原理之前,我們先從應(yīng)用層使用的高級(jí)別的API開始。這些API對(duì)于理解libhwui很重要。

文字API

用于布局和繪制文字主要有4個(gè)API:

  • android.widget.TextView:一個(gè)可以處理文字布局和渲染的視圖組件。
  • android.text.*:一個(gè)可以創(chuàng)建風(fēng)格化文字和布局的類集合。
  • android.graphics.Paint:用于測(cè)量文字。
  • android.graphics.Canvas:用于渲染文字。

TextView和android.text的都是在Paint和Canvas上的高級(jí)API。Android3.0以后,Paint和Canvas直接被實(shí)現(xiàn)在Skia之上,這是一個(gè)開源的渲染庫(kù)。SKia提供了一個(gè)很好的Freetype抽象實(shí)現(xiàn),這是一個(gè)很熱門的開源字體柵格化程序。

1-BitH26buboQae4iO-FpSyg

對(duì)于Android4.4,情況變得有些復(fù)雜。Paint和Canvas都使用了一個(gè)內(nèi)部的JNI API,叫做TextLayoutCache。它可以處理復(fù)雜的文字布局(CTL)。這個(gè)API依賴Harfbuzz,一個(gè)空間開源的字形引擎。TextLayoutCache的輸入是一個(gè)字體和一個(gè)Java的UTF-16的字符串,輸出是一個(gè)帶有x/y坐標(biāo)的字形列表。

TextLayoutCache是支持非拉丁語(yǔ)言的要點(diǎn),比如阿拉伯語(yǔ)言、希伯來語(yǔ)、泰國(guó)語(yǔ)等,本文不會(huì)解釋TextLayoutCache和 Harfbuzz的工作原理,但本人強(qiáng)烈建議讀者去學(xué)習(xí)學(xué)習(xí)CTL。如果在開發(fā)應(yīng)用的時(shí)候需要支持非拉丁語(yǔ)言環(huán)境,那么就要學(xué)習(xí)它了。如果你曾經(jīng)參與過 OpenGL渲染文字的文章中的討論,就會(huì)發(fā)現(xiàn)這種特殊的問題是很少見的。繪制文字比簡(jiǎn)單排布字形更復(fù)雜。某些語(yǔ)言中,比如阿拉伯語(yǔ)是從右到左的,還有泰 語(yǔ)甚至需要把字形排布在前一個(gè)字形的上面或者下面。

1-VvVj04gAzuTsMC_AN9RGRA

也就是說,當(dāng)直接或間接調(diào)用Canvas.drawText()函數(shù)的時(shí)候,OpenGL 渲染器不會(huì)收到你發(fā)送的參數(shù),而是收到一串?dāng)?shù)字、符號(hào)標(biāo)識(shí),還有x/y 坐標(biāo)集合。

點(diǎn)陣化和緩存

字體渲染器的每一個(gè)繪制方法都是和字體相關(guān)的。字體用于緩存?zhèn)€別字形符號(hào),而字形符號(hào)又被存儲(chǔ)在緩存結(jié)構(gòu)中(緩存結(jié)構(gòu)可以包含不同字體的字形符 號(hào))。緩存結(jié)構(gòu)是持有多個(gè)緩沖區(qū)的一個(gè)重要的對(duì)象,有block集合、pixel緩沖區(qū)、OpenGL結(jié)構(gòu)處理器,還有點(diǎn)陣緩沖區(qū)(也就是網(wǎng)格)。

1-qK4rIi_HDsEYPQQxFK5uPg

這個(gè)對(duì)象存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)比較簡(jiǎn)單:

  • 在字體渲染器中字體是存儲(chǔ)在一個(gè)LRU緩存中的;
  • 字形符號(hào)分別存儲(chǔ)在對(duì)應(yīng)的map字體集合中(key就是字形文件的identifier);
  • 緩存結(jié)構(gòu)使用一個(gè)塊鏈表集合來記錄空間的大??;
  • 像素緩沖區(qū)是一個(gè)uint8_t或者uint32_t類型的數(shù)組(作alpha值和RGBA的緩存);
  • 網(wǎng)格其實(shí)就是一個(gè)頂點(diǎn)數(shù)組,帶有兩個(gè)屬性:x/y位置和u/v坐標(biāo);
  • 一個(gè)GLuint的處理器。

字體渲染器對(duì)不同類型的緩存結(jié)構(gòu)提供了幾種緩存紋理實(shí)例,也就是根據(jù)不同的大小區(qū)分,這個(gè)大小可能會(huì)根據(jù)不同設(shè)備而有所不同,這里這里說的是默認(rèn)的大?。ň彺娴臄?shù)量是硬編碼的):

  • 1024*512 alpha緩存。
  • 2048*256 alpha緩存。
  • 2028*512alpha緩存。
  • 1024*512alpha緩存。
  • 2048*256alpha緩存。

當(dāng)緩存紋理對(duì)象創(chuàng)建之后,其對(duì)應(yīng)的緩沖區(qū)不會(huì)自動(dòng)分配空間,除了1024*512的alpha緩存總是自動(dòng)分配外,其它的都是根據(jù)需要來分配空間。

字形符號(hào)以列的形式打包在紋理中,只要字體渲染器遇到?jīng)]有緩存的符號(hào),它就會(huì)向緩存紋理請(qǐng)求響應(yīng)的類型(存儲(chǔ)在以上的有序列表中),然后緩存該符號(hào)。

這是上述的blocks列表使用到的地方,這個(gè)列表包含了當(dāng)前已分配的列和所有未分配的空間。如果字形符號(hào)和已經(jīng)存在的列匹配,那該字形符號(hào)就會(huì)被加到該列的底部。

如果所有列都被占用,從左邊的剩余空間開辟新列。因?yàn)樗凶煮w都是等寬的,渲染器會(huì)把每個(gè)字形的寬度弄成4像素的倍數(shù)(默認(rèn)是4像素)。這是對(duì)列的重利用和字形打包的一個(gè)折衷,這個(gè)打包目前還不是很好,但是實(shí)現(xiàn)起來比較快。

所有的字形符號(hào)都存儲(chǔ)在一個(gè)含有1個(gè)像素邊框的結(jié)構(gòu)中,這樣在雙線過濾采樣的時(shí)候可以避免偽跡的產(chǎn)生。

在文字帶有縮放變形操作的渲染中,了解文字何時(shí)被渲染也是非常重要的。這個(gè)變形操作直接到Skia/Freetype來處理,這就意味著字形符號(hào)是 在緩存結(jié)構(gòu)中變形存儲(chǔ)的。這樣可以改善渲染的質(zhì)量。幸運(yùn)的是,文字一般很少做縮放動(dòng)畫效果,就算是使用了,也只是設(shè)計(jì)很少的字形符號(hào)。本人做過很多實(shí)驗(yàn), 也沒有找到一個(gè)實(shí)際使用的場(chǎng)景。

還有其它關(guān)于paint的屬性會(huì)影響字形符號(hào)的柵格化和存儲(chǔ)的:粗體、斜體、還有X縮放(在Canvas上做矩陣變換)、字體風(fēng)格以及線條寬度等。

柵格化的可選方案

事實(shí)上,還有其它的方式去在GPU上處理文字字形符號(hào)??梢灾苯颖讳秩境滔蛄?,但是這樣做開銷很大。我調(diào)查過標(biāo)記距離字段的方法,但是簡(jiǎn)單實(shí)現(xiàn)的時(shí)候遇到了精度的問題(創(chuàng)建曲線的時(shí)候會(huì)不穩(wěn)定)。

本人建議讀者可以看看Glyphy這個(gè)項(xiàng)目。這是一個(gè)開源庫(kù),作者是Harfbuzz。項(xiàng)目在標(biāo)記距離字段技術(shù)上進(jìn)行延伸,同時(shí)也解決了精度的問題。我暫時(shí)沒有花太多時(shí)間看這個(gè)項(xiàng)目。但是上一次在做著色器的時(shí)候,發(fā)現(xiàn)這種技術(shù)在Android上是被禁止使用的。

預(yù)緩存技術(shù)

字形符號(hào)緩存是一定要做的。如果做預(yù)緩存的話,效果會(huì)更好。因?yàn)閘ibhwui是一個(gè)延遲的渲染器(和Skia的快速模式正好相反),所有屏幕上出現(xiàn)的字形都是一幀一幀開始的。在一系列的顯示操作(批處理和合并操作)中,字體渲染器需要盡可能多地緩存字形符號(hào)。

使用預(yù)緩存技術(shù)的主要優(yōu)勢(shì)在于,可以完全或者最小化紋理加載的時(shí)間。紋理加載操作是消耗非常大的,它會(huì)推延CPU或者GPU。甚至在幀渲染過程中,改變紋理還會(huì)在GPU體系結(jié)構(gòu)帶來更多內(nèi)存的壓力。

ImaginationTech的PowerVRml SGX GPUs使用了延遲疊加技術(shù)架構(gòu),可以提供很多有趣的特性。但如果在渲染幀時(shí)需要修改紋理,會(huì)強(qiáng)制要求驅(qū)動(dòng)程序?qū)y理進(jìn)行復(fù)制。因?yàn)樽煮w結(jié)構(gòu)相當(dāng)大,如果不好好處理紋理加載的話,很容易就內(nèi)存耗盡了。

這樣的場(chǎng)景確實(shí)發(fā)生在Google Play的一個(gè)應(yīng)用中。這個(gè)APP是一個(gè)簡(jiǎn)單的計(jì)算器,僅使用一些數(shù)學(xué)符號(hào)和數(shù)字進(jìn)行簡(jiǎn)單的繪制按鈕。字體渲染器在某的時(shí)候甚至渲染不出***幀。因?yàn)榘粹o 是連續(xù)進(jìn)行繪制的,每一個(gè)按鈕都會(huì)觸發(fā)一個(gè)紋理加載,然后復(fù)制整個(gè)字體緩存。系統(tǒng)根本沒有這么多內(nèi)存去存儲(chǔ)這么多緩存的備份。

清空緩存

因?yàn)橛米髯中尉彺娴募y理是非常大的,它們有時(shí)會(huì)被系統(tǒng)回收再利用,以便為其它程序更多的RAM。

當(dāng)用戶隱藏當(dāng)前的應(yīng)用時(shí),系統(tǒng)給應(yīng)用發(fā)送一條消息要求釋放盡可能多的內(nèi)存。很明顯,這就需要銷毀***的字形緩存結(jié)構(gòu)。在Android中,這個(gè)大緩存結(jié)構(gòu)就是所有字形的緩存。除了默認(rèn)***個(gè)創(chuàng)建的以外(1024*512的默認(rèn)緩存)。

紋理結(jié)構(gòu)在沒有存儲(chǔ)空間的時(shí)會(huì)被清空。字體渲染器使用LRU算法對(duì)素有字體進(jìn)行記錄,僅僅是記錄而已。如果需要,就會(huì)根據(jù)最近最少使用的紋理來清除內(nèi)存。目前沒有提供這個(gè)操作,但是它確實(shí)是一個(gè)不錯(cuò)的優(yōu)化策略。

批處理和合并操作

Android4.3引入的繪制批處理和合并操作是一項(xiàng)重要的優(yōu)化,徹底減少了大量往OpenGL驅(qū)動(dòng)發(fā)送指令的問題。

為了進(jìn)行合并操作,字體渲染器在進(jìn)行多種繪制調(diào)用的時(shí)候會(huì)緩存文字,每個(gè)緩存紋理都會(huì)擁有一個(gè)客戶端的2048 quads的數(shù)組(1 quad = 1 glyph)。當(dāng)調(diào)用lilbhwui中的一個(gè)文字繪制API時(shí),字體渲染器獲取合適的網(wǎng)格為每個(gè)字形符號(hào)進(jìn)行位置和u/v坐標(biāo)的繪制。網(wǎng)格在批處理的末 端被發(fā)送到GPU上(由延遲顯示系統(tǒng)決定)?;蛘弋?dāng)一個(gè)quad的緩沖區(qū)滿了的時(shí)候,可能會(huì)出現(xiàn)多網(wǎng)格渲染同一個(gè)字符串的情況——一個(gè)字符緩存占用一個(gè)網(wǎng) 格。

這個(gè)優(yōu)化過程很容易實(shí)現(xiàn),對(duì)顯示效果幫助也很大。因?yàn)樽煮w渲染器使用多緩存結(jié)構(gòu),所以在一個(gè)字符串的渲染過程匯總,可能字形符號(hào)會(huì)來自不同的紋理。 如果沒有批處理好合并操作的話,每個(gè)繪制調(diào)用都要傳遞給GPU。字體渲染器就需要不斷切換不同的緩存結(jié)構(gòu),這樣會(huì)帶來很大的消耗。

在測(cè)試字體渲染器的時(shí)候,我已經(jīng)在一個(gè)測(cè)試App中發(fā)現(xiàn)了這個(gè)問題。這個(gè)App只是簡(jiǎn)單地用不同的樣式和大小渲染一句“hello world”。其中字母“o”被存儲(chǔ)在不同的紋理中,和其它的字符不一樣。這種情況導(dǎo)致字體渲染器開始時(shí)只繪制了“hell”,然后渲染“o”,然后再渲 染“w”,然后在渲染“o”,接著才是“rld”。這5個(gè)繪制調(diào)用和5個(gè)紋理進(jìn)行綁定連接后,只有其中兩個(gè)是實(shí)際需要的,現(xiàn)在渲染器先繪制“hell w rld”,然后在一起繪制兩個(gè)“o”,這就是批處理和合并操作的好處了。

優(yōu)化紋理加載

之前提到過字體渲染在更新緩存紋理的時(shí)候(記錄每個(gè)紋理中的臟數(shù)據(jù)塊)會(huì)盡可能加載少一點(diǎn)數(shù)據(jù)。但是很不幸,這個(gè)方法還是有兩個(gè)限制。

首先,OpenGL ES2.0不允許隨意上傳一個(gè)矩形區(qū)域。glTextSubImage2D 會(huì)讓你指定矩形的x/y坐標(biāo)和寬高來更新矩形里面的紋理。并且它會(huì)把矩形的寬當(dāng)做內(nèi)存里的數(shù)據(jù)幅度,這個(gè)可以通過創(chuàng)建一個(gè)合適大小的CPU緩沖區(qū)來解決, 但是也需要事先知道這個(gè)矩形的到底有多大。

有一個(gè)很好的折衷,就是加載包含臟數(shù)據(jù)塊(矩形)的最小像素帶。因?yàn)檫@個(gè)像素帶和紋理一樣寬,這樣就可以節(jié)省空間。比每次都要更新整個(gè)紋理效果好得多。

第二個(gè)問題是紋理加載屬于異步調(diào)用,這樣可能造成相當(dāng)長(zhǎng)的CPU延遲(甚至可能會(huì)達(dá)到1毫秒,依賴紋理的大小、驅(qū)動(dòng)程序還有GPU)。像之前說的那 樣,如果使用預(yù)緩存應(yīng)該是沒有問題的。但是如果使用的是“重字體”的場(chǎng)景,或者是區(qū)域化語(yǔ)言的場(chǎng)景的話(較多的使用字形符號(hào)比如中文),那么問題就還是會(huì) 出現(xiàn)的。

令人欣慰的是,OpenGL3.0為這兩個(gè)問題提供了解決方案,這樣就可以直接使用一個(gè)像素存儲(chǔ)的屬性來加載數(shù)據(jù)矩形了。GL_UNPACK_ROW_LENGTH這個(gè)屬性指定了內(nèi)存源數(shù)據(jù)的寬度。需要注意的是,這個(gè)屬性會(huì)影響到當(dāng)前OpenGL上下文的全局狀態(tài)。

加載紋理時(shí),CPU延遲可以通過使用像素緩沖對(duì)象(PBOs)來避免。就像所有OpenGL里的緩沖區(qū)對(duì)象一樣PBO會(huì)駐留在GPU中,但也可以映 射到內(nèi)存中。PBOs有很多有趣的屬性,但是我們關(guān)心的是一個(gè)在主存中取消映射關(guān)系后還可以進(jìn)行異步加載紋理的屬性,此時(shí)操作隊(duì)列變成:

glMapBufferRange → write glyphs to buffer → glUnmapBuffer → glPixelStorei(GL_UNPACK_ROW_LENGTH) → glTexSubImage2D

調(diào)用glTexSubImage2D可以立即返回,而不用阻塞渲染器,字體渲染器可以在內(nèi)存中映射整個(gè)緩沖區(qū),而且似乎不會(huì)出現(xiàn)問題。這對(duì)于緩存紋理的更新操作是一個(gè)不錯(cuò)的方案。

這兩種OpenGL ES3.0的優(yōu)化方法會(huì)出現(xiàn)在Android4.4中。

陰影效果

一般文字在渲染的時(shí)候都會(huì)帶有陰影效果,這是一個(gè)相當(dāng)耗費(fèi)資源的操作。在臨近的字形符號(hào)可以進(jìn)行相互模糊操作之后,字體渲染器不再進(jìn)行獨(dú)立的預(yù)模糊 操作。有很多中方法可以實(shí)現(xiàn)模糊化,但是為了在同一幀中把這些調(diào)配操作和紋理采樣操作最小化,陰影效果會(huì)被簡(jiǎn)單存儲(chǔ)為紋理,在多幀切換的時(shí)候可以保存。

因?yàn)閼?yīng)用程序可以輕易地拖垮GPU,所以我們還是得依靠CPU來對(duì)文字進(jìn)行模糊化。最簡(jiǎn)單和高效的方式就是使用Renderscript的C++ API,只需要簡(jiǎn)單幾行代碼就可以實(shí)現(xiàn)核心功能。最簡(jiǎn)單的方法是在初始化Renderscript的時(shí)候指定RS_INIT_LOW_LATENCY標(biāo)記 來強(qiáng)制運(yùn)行在CPU上。

未來的優(yōu)化操作

有一個(gè)優(yōu)化方法我希望可以在我離開Android團(tuán)隊(duì)之前實(shí)現(xiàn)。文字預(yù)緩存、異步和部分紋理更新都是一些重要的優(yōu)化操作。但是柵格化文字符號(hào)一直都是一個(gè)很耗費(fèi)資源的操作,在systrace可以很容易看到(啟用gfs標(biāo)識(shí)然后看precacheText事件)。

對(duì)預(yù)緩存的一個(gè)簡(jiǎn)單的優(yōu)化方式就是,把這個(gè)操作放到另一個(gè)工作線程去執(zhí)行,把柵格化操作放到后臺(tái)。這個(gè)技術(shù)已經(jīng)被用到一些復(fù)雜的路徑柵格化操作中,但是沒有添加到OpenGL架構(gòu)之中。

改進(jìn)批處理和合并操作也是一個(gè)可能的優(yōu)化方式,用于繪制文字的顏色一般是被發(fā)送到一個(gè)fragment陰影統(tǒng)一操作。這樣可以減少發(fā)送到GPU的頂 點(diǎn)數(shù)據(jù),但副作用會(huì)產(chǎn)生很多不需要的批處理指令:一個(gè)批處理操作只能包含一種文字顏色。如果文字顏色也存儲(chǔ)為頂點(diǎn)屬性,那么就可以網(wǎng)GPU傳遞更少的數(shù) 據(jù)。

源代碼

如果想詳細(xì)地看看字體渲染器的實(shí)現(xiàn),可以瀏覽libhwui的GitHub,可以從FontRender.cpp開始,因?yàn)楹芏囿@喜都在這里發(fā)生,它的支持類可以在font或者sub目錄找到。對(duì)了,PixelBuffer.cpp這個(gè)文件也不錯(cuò),可以看看。這就是一個(gè)像素緩沖區(qū)的抽象實(shí)現(xiàn),可以用于CPU(uint8_t類型的數(shù)組)或者GPU緩沖區(qū)(PBO)。

***的話

本文只是對(duì)Android的字體渲染器進(jìn)行簡(jiǎn)單介紹,還有很多實(shí)現(xiàn)的細(xì)節(jié)沒有考慮到,或者很多問題以后會(huì)說明,所以有什么問題可以盡管向我提問。

原文鏈接: medium   翻譯: chris

譯文鏈接: http://blog.jobbole.com/70468/

責(zé)任編輯:閆佳明 來源: blog.jobbole
相關(guān)推薦

2010-08-13 11:02:27

Flex渲染器

2009-07-15 13:48:26

Swing模型和渲染器

2009-07-16 10:11:06

渲染器RendererSwing組件

2009-07-16 10:26:49

渲染器接口Swing

2009-11-23 19:51:48

ibmdwWeb

2017-12-26 14:27:24

2010-08-13 11:21:31

Flex渲染器

2017-05-10 14:47:37

Headless Ch頁(yè)面 Docker

2019-08-01 15:19:26

前端開發(fā)技術(shù)

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2023-05-24 16:41:41

React前端

2010-06-30 13:45:05

ZKZK 5.0.3

2020-11-06 15:20:45

瀏覽器前端架構(gòu)

2014-04-29 14:16:54

2012-06-01 10:28:54

Web

2012-06-06 15:57:29

Web

2022-08-14 23:04:54

React前端框架

2022-07-04 08:29:13

electron通信

2013-10-31 10:54:11

ServerClouda

2013-11-18 14:42:53

瀏覽器渲染
點(diǎn)贊
收藏

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

无遮挡爽大片在线观看视频| 国产又粗又猛又爽| 亚洲国产精品嫩草影院久久av| 欧美性xxxxx极品娇小| 蜜桃成人在线| 99精品在线看| 久久久国产精品一区二区中文| 日韩有码片在线观看| 中国免费黄色片| av成人在线观看| 午夜精品视频在线观看| 亚洲精品日韩精品| 天堂av中文字幕| 看国产成人h片视频| 97久久精品人搡人人玩| 岛国片在线免费观看| 美女一区二区在线观看| 在线播放日韩导航| 97视频在线免费播放| caoporn97在线视频| 久久久精品黄色| 国产精品乱码视频| 国产又粗又大又爽| 手机精品视频在线观看| 国内精品模特av私拍在线观看| 国产不卡在线观看视频| 亚洲97av| 亚洲国产精品va在线| 三区视频在线观看| 欧美va在线观看| 毛片在线播放a| 伊人情人综合网| 亚洲香蕉伊综合在人在线视看| 不许穿内裤随时挨c调教h苏绵| 小明成人免费视频一区| 韩曰欧美视频免费观看| 日本五级黄色片| www免费在线观看| 国产精品免费免费| 色播亚洲婷婷| 国产黄色片在线播放| 91在线视频网址| 国产一区二区三区无遮挡 | 精品视频一区二区不卡| 2022亚洲天堂| 毛片在线网站| 精品动漫一区二区三区| 国产一区二区四区| 青春草在线免费视频| 亚洲欧美一区二区久久 | 亚洲精品婷婷| 97在线看福利| 在线能看的av| 亚洲综合不卡| 国产99久久精品一区二区永久免费 | 51国偷自产一区二区三区| 97超碰资源站| 极品尤物av久久免费看| 亚洲字幕在线观看| 亚洲成人777777| 成人国产精品免费观看| 精品国产乱码久久久久久88av| 黄色av网站免费在线观看| 成人激情免费电影网址| 精品高清视频| 成a人片在线观看www视频| 国产精品视频一二三| 永久久久久久| 成人日日夜夜| 亚洲国产cao| 97成人在线观看视频| 浪潮色综合久久天堂| 欧美日韩一级黄| 欧美激情第四页| 国内精品偷拍| 亚洲裸体xxxx| 日本美女黄色一级片| 欧美~级网站不卡| 午夜精品一区二区三区在线视频 | 欧美日韩精品免费| 国产男女无遮挡猛进猛出| 中文字幕一区二区三区中文字幕 | 国产精品av久久久久久无| 成久久久网站| 欧美精品激情blacked18| 99热只有这里有精品| 日本免费在线视频不卡一不卡二| 国产在线久久久| 日本免费不卡视频| 国产欧美日韩一区二区三区在线观看| 在线视频不卡一区二区| 嗯~啊~轻一点视频日本在线观看| 色婷婷精品大在线视频| 亚洲欧美日韩网站| 神马久久影院| 久久影视免费观看| av图片在线观看| 国产精品中文字幕日韩精品| 精品一区二区三区日本| 欧美成人高清在线| 欧美日韩综合视频| 午夜福利123| 国产日产精品一区二区三区四区的观看方式 | 色偷偷www8888| 国产精品社区| 999视频在线观看| 韩国免费在线视频| 亚洲综合精品久久| 中日韩av在线播放| 你懂的一区二区三区| 欧美丰满老妇厨房牲生活| 免费又黄又爽又猛大片午夜| 高清久久久久久| 国产高清精品软男同| 在线成人av观看| 精品1区2区在线观看| chinese全程对白| 狂野欧美一区| 精品一区久久久| 日本aa在线| 91麻豆精品国产自产在线观看一区| 女人被狂躁c到高潮| 欧美另类专区| 91视频国产高清| 在线视频婷婷| 欧美亚洲一区二区在线观看| 99久久人妻精品免费二区| 国语精品一区| 亚洲自拍偷拍色图| xvideos国产在线视频| 9191久久久久久久久久久| 亚洲ⅴ国产v天堂a无码二区| 久久黄色影院| 久久人人九九| 在线免费三级电影网站| 亚洲黄色www| 日韩美女黄色片| 成人毛片视频在线观看| wwwjizzjizzcom| 国产精品一区二区三区www| 日韩在线视频免费观看| 最近中文字幕免费在线观看| 久久亚洲捆绑美女| 国产福利视频在线播放| 嫩草一区二区三区| 国产福利视频一区| shkd中文字幕久久在线观看| 在线观看国产日韩| 成人小视频免费看| 美女免费视频一区二区| 在线观看日韩片| 亚洲三级在线| 欧美成人免费全部观看天天性色| 国产毛片毛片毛片毛片| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品一级片| 久草免费福利在线| 欧美日韩看看2015永久免费 | 中文字幕日韩免费视频| 中文字幕一区2区3区| 国产精品免费视频观看| 色18美女社区| 韩国av一区| 久久亚洲免费| 精品国产黄a∨片高清在线| 丝袜情趣国产精品| 精品人妻午夜一区二区三区四区| 一卡二卡欧美日韩| 少妇精品一区二区三区| 欧美aa在线视频| 日本丰满少妇黄大片在线观看| 日本一区精品视频| 4p变态网欧美系列| 91露出在线| 精品国产一区二区三区久久久蜜月 | 欧美丝袜激情| 亚洲影视九九影院在线观看| 成年人视频免费在线播放| 亚洲女同性videos| 亚洲午夜精品久久久| 亚洲精品成人天堂一二三| 亚洲熟女乱综合一区二区三区 | 午夜精品福利在线| 亚洲自拍偷拍图| 国产精品99久| 日本黄网站免费| 欧美不卡视频| 日本成人三级| 91欧美极品| 国产精品久久久久久久一区探花| 成人短视频在线| 亚洲区中文字幕| 国产高清在线免费| 日本福利一区二区| 欧美激情精品久久| 国产欧美日韩一区二区三区在线观看| 性xxxxxxxxx| 日本不卡视频在线观看| 精品成在人线av无码免费看| 成人羞羞网站入口免费| 国产精品三区四区| 国产精品xnxxcom| 国产97免费视| rebdb初裸写真在线观看| 精品国产一区二区在线| 亚洲三级中文字幕| 日韩一区二区中文字幕| 波多野结衣大片| 亚洲mv大片欧洲mv大片精品| caoporn91| 欧美国产日本韩| 日批在线观看视频| 国产一区不卡在线| 国产一伦一伦一伦| 久久一区精品| 国产精品网站免费| 欧美日韩a区| 欧美 日韩 国产 在线观看| 国产欧美日韩精品一区二区免费| 国产在线观看一区| 91成人入口| 91九色对白| 24小时成人在线视频| 国产精品视频免费在线观看| 在线人成日本视频| 69久久夜色精品国产69| 丁香花在线观看完整版电影| 久久亚洲电影天堂| 免费日本一区二区三区视频| 一区二区三区日韩在线| 你懂的视频在线免费| 亚洲精品国产电影| 蜜桃在线一区二区| 精品国产sm最大网站免费看| av中文字幕免费| 欧美精品xxxxbbbb| 97精品人妻一区二区三区| 欧美日韩一区二区三区不卡| 欧美性猛交xxxx乱大交hd| 日韩人体视频一二区| 欧美一级片免费在线观看| 日韩欧美国产视频| 日韩不卡在线播放| 色婷婷久久99综合精品jk白丝| 国产性猛交╳xxx乱大交| 五月激情六月综合| 亚洲欧美综合另类| 色婷婷综合久久久中文一区二区| 亚洲熟妇无码乱子av电影| 一本大道av伊人久久综合| 免费看毛片网站| 在线免费观看不卡av| 国产精品无码粉嫩小泬| 欧美午夜在线观看| 一女二男一黄一片| 日韩一区二区三区免费观看| 成人久久久精品国产乱码一区二区| 欧美xxxxx牲另类人与| 日韩在线观看视频一区| 亚洲精品综合精品自拍| 国产最新视频在线观看| 最近的2019中文字幕免费一页| 日本免费在线视频| 欧美大奶子在线| 国产高潮在线| 国产精品久久久久久久久久久不卡 | 亚洲电影一区二区三区| 日本中文字幕免费| 色婷婷久久久亚洲一区二区三区| 亚洲在线观看av| 日韩三级高清在线| 欧美孕妇孕交| 日韩视频免费中文字幕| 成人影音在线| 国产精品 欧美在线| 国产激情精品一区二区三区| 国产精选一区二区| 深爱激情综合网| 美女黄色片网站| 中文精品在线| 日韩高清第一页| 成人禁用看黄a在线| 国产伦理片在线观看| 亚洲伦在线观看| 探花视频在线观看| 欧美妇女性影城| 无码国产伦一区二区三区视频| 国产亚洲精品激情久久| 先锋成人av| 国产精品观看在线亚洲人成网| 免费观看性欧美大片无片| 久久久久一区二区| 亚洲精品网址| 亚洲精品无码久久久久久| 国内精品在线播放| 成人乱码一区二区三区av| 亚洲女人****多毛耸耸8| 五月天综合激情| 欧美肥胖老妇做爰| 黄色小视频在线免费观看| 欧美日韩国产成人高清视频| 日本综合视频| 国产亚洲欧美一区二区三区| 99久久久久国产精品| 免费在线观看毛片网站| 国产盗摄视频一区二区三区| 久久久久久成人网| 精品女厕一区二区三区| 国产三区在线播放| 中文综合在线观看| 国偷自产一区二区免费视频| 亚洲一区二区免费在线| japanese国产精品| 日韩精品视频久久| av在线不卡网| 久草视频免费在线播放| 欧美精品一二三四| 97人人在线| 国产精品久久久久久久app| 日韩欧美在线精品| 久久这里只有精品8| 国产在线麻豆精品观看| 亚洲欧洲综合网| 欧美性猛交一区二区三区精品| 十九岁完整版在线观看好看云免费| 欧美国产日韩一区二区三区| 国产精品一区二区精品| 咪咪色在线视频| 免费成人你懂的| 少妇一级黄色片| 欧美性感一类影片在线播放| 你懂得网站在线| 91精品国产自产91精品| 老司机在线精品视频| 亚洲精品蜜桃久久久久久| 丁香婷婷综合激情五月色| 麻豆精品一区二区三区视频| 91精品国产入口| 国产调教视频在线观看| 成人做爽爽免费视频| 99久久婷婷| 中文字幕在线观看视频www| 亚洲免费av高清| 国产av无码专区亚洲av| 久久国产精品网站| 美女国产精品久久久| 一二三四中文字幕| 成人高清在线视频| 日韩三级小视频| 亚洲精品视频久久| 三上悠亚亚洲一区| 香蕉久久免费影视| 狠狠色综合日日| 免费一级a毛片夜夜看| 精品久久五月天| 在线观看爽视频| 日韩欧美亚洲日产国| 久久激情五月婷婷| 日本精品在线免费观看| 精品乱码亚洲一区二区不卡| 美女网站在线看| 日韩精品一区二区三区四区五区 | 色偷偷一区二区三区| 99免在线观看免费视频高清| 成人激情av在线| 国产精品九九| 中文人妻一区二区三区| 在线观看91精品国产入口| 国产日产一区二区| 国产精品加勒比| 日日欢夜夜爽一区| 日韩av手机在线免费观看| 精品国产91亚洲一区二区三区婷婷| 高潮在线视频| 亚洲视频在线二区| 成人免费视频视频在线观看免费| 在线观看免费国产视频| 色婷婷**av毛片一区| 一区二区视频| 久草在在线视频| 亚洲精品免费在线播放| 香蕉视频免费在线看| 国产精品亚发布| 亚洲午夜极品| 免费看的黄色录像| 亚洲国产成人av在线| 青青在线精品| 中文字幕无码精品亚洲35| 国产精品欧美一级免费| 三级网站在线看| 国产在线观看精品| 麻豆成人精品| 色在线观看视频| 亚洲欧美在线第一页| 欧美久久亚洲| 88av.com| 午夜av区久久| 成人影院在线观看| 台湾成人av| 99久久精品久久久久久清纯|