精品欧美一区二区三区在线观看 _久久久久国色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)

91精品国产综合久久精品麻豆| 国产亚洲精品精华液| 久久精品视频在线| 美女流白浆视频| 国产精品25p| 久久久精品人体av艺术| 国产日韩在线看| 亚洲色婷婷一区二区三区| 久久97精品| 欧洲亚洲精品在线| 免费的一级黄色片| 精品无人乱码| 蜜桃av一区二区| 欧美激情小视频| a级片在线观看| 日韩影片在线观看| 欧洲精品中文字幕| 2021国产视频| 丁香婷婷在线观看| www.欧美日韩| 国产在线精品一区免费香蕉| 五月天综合在线| 久久视频在线| 日韩成人性视频| 中文字幕成人免费视频| 亚洲同志男男gay1069网站| 成人免费一区二区三区在线观看 | 久久高清免费视频| 成人情趣视频| 亚洲精品国产精品国自产在线 | 国产成人午夜精品5599| 国产成人鲁鲁免费视频a| 久久久久性色av无码一区二区| 国产一区二区在线| 日韩精品高清在线| 国产精九九网站漫画| 五月天色综合| 日本乱码高清不卡字幕| 精品这里只有精品| 欧美xxxx黑人又粗又长| 亚洲美女视频在线观看| 亚洲在线不卡| 国产视频二区在线观看| 久久亚洲一区二区三区四区| 精品日本一区二区三区| 免费成人在线看| 精品无人码麻豆乱码1区2区| 国产精品人成电影| 草草久久久无码国产专区| 黄色成人影院| 中文字幕亚洲不卡| 亚洲v日韩v欧美v综合| 免费毛片一区二区三区久久久| 永久免费看mv网站入口| 欧美天天综合| 亚洲欧美一区二区激情| 给我看免费高清在线观看| 九九热hot精品视频在线播放| 日韩美女视频一区二区在线观看| 色网站在线视频| 久草综合在线| 777精品伊人久久久久大香线蕉| 亚洲国产精品三区| 日本成人在线网站| 欧美精品日日鲁夜夜添| 在线免费观看av网| 久久精品九色| 日韩免费高清视频| xfplay5566色资源网站| 日本欧美韩国国产| 精品一区二区三区电影| 欧美做受高潮6| 欧美电影三区| 欧美裸体男粗大视频在线观看| 久久久91视频| 最新日韩在线| 国产成人亚洲综合| 一级日韩一级欧美| 国产69精品久久久久777| 黑人中文字幕一区二区三区| 色哟哟在线观看| 国产喷白浆一区二区三区| 亚洲一区二区三区乱码| 色呦呦在线资源| 岛国av一区二区| 欧美性猛交xxx乱久交| 亚洲三级电影| 亚洲第一av网站| 谁有免费的黄色网址| 国产精品久久久久蜜臀| 欧美激情视频给我| 亚洲欧美一二三区| 国产剧情av麻豆香蕉精品| 91在线高清视频| 色av男人的天堂免费在线| 国产精品美女一区二区三区| 中文字幕人妻熟女人妻洋洋| 日韩电影大全网站| 91精品婷婷国产综合久久性色| av黄色一级片| 99久久夜色精品国产亚洲狼 | 鲁丝一区二区三区免费| 1769视频在线播放免费观看| 亚洲国产另类精品专区| 欧美婷婷精品激情| 97视频一区| 国产一区二区日韩| 日本三级2019| 麻豆精品视频在线观看| 国产一区二区三区黄| 香港伦理在线| 欧美天堂在线观看| 手机看片国产精品| 精品国产一区二区三区| 久久久久久久91| 一级片aaaa| 久久人人爽爽爽人久久久| 白白操在线视频| 另类中文字幕国产精品| 亚洲精品动漫100p| 久草成人在线视频| 久久99国内精品| 欧美亚洲另类在线一区二区三区| 麻豆蜜桃在线| 91精品国产乱码| 黄色三级生活片| 99香蕉国产精品偷在线观看 | 人人澡人人澡人人看欧美| www.黄色国产| 亚洲欧洲日韩在线| 久久九九国产视频| 琪琪久久久久日韩精品| 欧美劲爆第一页| 国产老妇伦国产熟女老妇视频| 国产日韩一级二级三级| 亚洲 高清 成人 动漫| 亚洲国产aⅴ精品一区二区| 久久中文字幕视频| 在线免费看av片| 欧美国产精品一区二区三区| 日韩黄色片视频| 久久成人福利| 国内精品久久久久伊人av | 国产成人在线视频免费播放| 丰满女人性猛交| 日韩av黄色| 爽爽爽爽爽爽爽成人免费观看| 亚洲图片欧美日韩| 久久精品亚洲精品国产欧美kt∨ | 亚洲国产日韩欧美在线99| 欧美黄色一级网站| 粉嫩av一区二区三区在线播放 | 欧洲精品二区| 欧美不卡激情三级在线观看| 麻豆成人在线视频| 成人精品一区二区三区四区| 亚洲色欲久久久综合网东京热| 亚洲精品黑牛一区二区三区| 欧美高清一级大片| 老牛影视av牛牛影视av| 午夜视频一区二区三区| 国产毛片毛片毛片毛片毛片毛片| 亚洲欧美日韩在线观看a三区| 久久久久久久有限公司| 偷拍视频一区二区三区| 一本久久综合亚洲鲁鲁| 91在线公开视频| 亚洲人成网站在线| 四虎成人免费视频| 国产免费成人| 午夜精品一区二区三区在线观看| 欧美一区二区三区婷婷| 免费91麻豆精品国产自产在线观看| www.国产欧美| 狠狠做深爱婷婷久久综合一区 | 亚洲视频中文字幕| 成人啪啪18免费游戏链接| 国产精品人人爽人人做我的可爱| 日本一区高清在线视频| 一区二区三区日本视频| 久久久久久久久久久国产| 欧美少妇另类| 欧美美女一区二区在线观看| 久久久久97国产| 久久久国产综合精品女国产盗摄| 中文字幕线观看| 亚洲电影在线| 日韩一区免费观看| 欧美2区3区4区| 欧美在线视频网站| 免费黄色在线网站| 亚洲国产精品小视频| 久草视频在线免费| 亚洲综合激情网| 精品成人无码一区二区三区| 国产精品性做久久久久久| 阿v天堂2017| 久久精品影视| 蜜桃视频日韩| 欧美午夜网站| 国产精品av电影| 日韩三级电影视频| 中文字幕免费国产精品| 亚洲精品久久久久久动漫器材一区 | 精品久久久网站| 波多野结衣视频观看| 亚洲制服丝袜在线| 纪美影视在线观看电视版使用方法| 国产成人在线视频免费播放| 91网址在线播放| 一本色道88久久加勒比精品| 日本不卡一区二区三区四区| 亚洲男人都懂第一日本| 99视频在线播放| 国产精品传媒麻豆hd| 4438全国成人免费| 一级α片免费看刺激高潮视频| 亚洲最色的网站| 欧美乱大交做爰xxxⅹ小说| 91在线丨porny丨国产| 99999精品| 日韩国产欧美在线播放| 男人添女人下面高潮视频| 亚洲人成免费网站| 色狠狠久久av五月综合| 图片婷婷一区| 国产91精品一区二区绿帽| 国产精品毛片无码| 国产精品视频播放| 亚洲黄色网址| 91精品国产91久久| heyzo中文字幕在线| 色与欲影视天天看综合网| 2021av在线| 国产亚洲视频在线观看| 欧美香蕉爽爽人人爽| 亚洲成人三级在线| 亚洲AV无码精品国产| 91精品国产综合久久香蕉麻豆| 中文字幕人妻丝袜乱一区三区| 欧美性xxxxhd| 青青草免费观看视频| 偷拍与自拍一区| 香蕉视频一区二区| 精品久久香蕉国产线看观看亚洲| 麻豆影视在线播放| 一区二区三区精品在线| 免费日韩在线视频| 亚洲第一在线综合网站| 国产午夜激情视频| 亚洲v精品v日韩v欧美v专区| 久久精品久久国产| 午夜影视日本亚洲欧洲精品| 日韩av免费网址| 精品久久久久久中文字幕一区奶水| 国产成人自拍视频在线| 福利精品视频在线| 精品人妻一区二区三区潮喷在线 | www.xxxx国产| 精品日韩欧美在线| 国模无码一区二区三区| 亚洲第一福利视频| 欧洲成人av| 伊人久久五月天| 快射av在线播放一区| 欧美丰满老妇厨房牲生活 | 人妻巨大乳一二三区| 国产高清精品久久久久| 在线看黄色的网站| 99视频一区二区三区| www.av欧美| 中文字幕一区二区三区蜜月| 久久久久亚洲av无码专区 | www.欧美三级电影.com| av在线下载| 欧美一区亚洲一区| 国产成+人+综合+亚洲欧美| 91老司机精品视频| 精品在线网站观看| 日韩欧美精品在线不卡| 欧美在线播放| 成年人视频观看| 久久国内精品自在自线400部| 亚洲精品一二三四| 久久新电视剧免费观看| 秋霞欧美一区二区三区视频免费| 一区二区欧美国产| 伊人久久久久久久久久久久| 91精品国产黑色紧身裤美女| 日本啊v在线| 久久这里有精品| 成人教育av| 亚洲一区二区三区在线视频 | 一区二区日本伦理| 国产精品a级| 能看的毛片网站| 国产成人av自拍| 亚洲黄色免费视频| 亚洲国产美女搞黄色| 99re热视频| 亚洲国产精品久久久久秋霞蜜臀| a黄色在线观看| 亚州av一区二区| 国产免费av国片精品草莓男男| 欧美三级电影在线播放| 国产综合婷婷| 色天使在线观看| 久久在线观看免费| 国产亚洲精品码| 欧美日韩高清一区| 青青久在线视频免费观看| 九九久久久久99精品| 2019年精品视频自拍| 久久草.com| 伊人天天综合| 天天干天天曰天天操| 国产精品久久福利| 久久久久久不卡| 亚洲成人教育av| 超鹏97在线| 国产欧美一区二区三区在线看| 伊人久久大香线蕉| 精品久久一二三| 国产91精品一区二区麻豆亚洲| 久久精品在线观看视频| 在线观看亚洲一区| 日韩av免费观影| 97在线观看免费| 国产成人在线中文字幕| 欧美国产综合在线| 国产精品一二二区| 99久久99久久精品国产| 欧美日韩激情一区二区三区| 国产日韩精品在线看| 日本精品视频在线播放| 色88888久久久久久影院| 青青草精品视频在线| 成人性视频网站| 久草视频手机在线观看| 日韩欧美一区二区久久婷婷| av网站导航在线观看免费| 91精品在线看| 一区二区影院| 91av免费观看| 亚洲一区二区三区三| 亚洲产国偷v产偷v自拍涩爱| 欧美成人一区在线| 日韩一级淫片| 久久久久久免费看| 99re亚洲国产精品| 美女又爽又黄免费视频| 亚洲人成在线电影| 国产综合色在线观看| 亚洲一区3d动漫同人无遮挡| 另类欧美日韩国产在线| 日韩在线不卡av| 日韩一级黄色片| 俄罗斯一级**毛片在线播放| 国产尤物99| 母乳一区在线观看| 日本爱爱爱视频| 欧美日韩在线一区二区| 很黄的网站在线观看| 5g影院天天爽成人免费下载| 激情婷婷久久| 国产三级国产精品| 欧洲av在线精品| 4438x成人网全国最大| 国产精品久久亚洲7777| 亚洲一区图片| 精品伦精品一区二区三区视频密桃| 538prom精品视频线放| 免费网站在线观看人| 蜜桃成人在线| 麻豆成人免费电影| 久久久久久天堂| 亚洲美女av网站| 四虎精品一区二区免费| 91午夜在线观看| 国产日产欧美精品一区二区三区| 一女二男一黄一片| 午夜精品一区二区三区在线视频 | 色天天综合狠狠色| 麻豆一二三区精品蜜桃| 欧美一级在线看| 成人免费一区二区三区视频| 欧美在线精品一区二区三区| 日本午夜在线亚洲.国产| 天天综合一区| 国产精品嫩草av| 欧美丰满嫩嫩电影| 超碰91在线观看| 中文字幕不卡每日更新1区2区| 成人av在线观| 中文字幕一区二区三区四区视频 | 午夜精品一区二区三区在线观看| 国模少妇一区二区三区| 久久精品免费在线| 中文字幕亚洲综合久久筱田步美| 香蕉成人app|