欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

flutter合成,flutter構(gòu)造函數(shù)

Android圖形渲染原理上

對于Android開發(fā)者來說,我們或多或少有了解過Android圖像顯示的知識點,剛剛學(xué)習(xí)Android開發(fā)的人會知道,在Actvity的onCreate方法中設(shè)置我們的View后,再經(jīng)過onMeasure,onLayout,onDraw的流程,界面就顯示出來了;對Android比較熟悉的開發(fā)者會知道,onDraw流程分為軟件繪制和硬件繪制兩種模式,軟繪是通過調(diào)用Skia來操作,硬繪是通過調(diào)用Opengl ES來操作;對Android非常熟悉的開發(fā)者會知道繪制出來的圖形數(shù)據(jù)最終都通過GraphiBuffer內(nèi)共享內(nèi)存?zhèn)鬟f給SurfaceFlinger去做圖層混合,圖層混合完成后將圖形數(shù)據(jù)送到幀緩沖區(qū),于是,圖形就在我們的屏幕顯示出來了。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供延安網(wǎng)站建設(shè)、延安做網(wǎng)站、延安網(wǎng)站設(shè)計、延安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、延安企業(yè)網(wǎng)站模板建站服務(wù),十載延安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

但我們所知道的Activity或者是應(yīng)用App界面的顯示,只屬于Android圖形顯示的一部分。同樣可以在Android系統(tǒng)上展示圖像的WebView,F(xiàn)lutter,或者是通過Unity開發(fā)的3D游戲,他們的界面又是如何被繪制和顯現(xiàn)出來的呢?他們和我們所熟悉的Acitvity的界面顯示又有什么異同點呢?我們可以不借助Activity的setView或者InflateView機制來實現(xiàn)在屏幕上顯示出我們想要的界面嗎?Android系統(tǒng)顯示界面的方式又和IOS,或者Windows等系統(tǒng)有什么區(qū)別呢?……

去探究這些問題,比僅僅知道Acitvity的界面是如何顯示出來更加的有價值,因為想要回答這些問題,就需要我們真正的掌握Android圖像顯示的底層原理,當(dāng)我們掌握了底層的顯示原理后,我們會發(fā)現(xiàn)WebView,F(xiàn)lutter或者未來會出現(xiàn)的各種新的圖形顯示技術(shù),原來都是大同小異。

我會花三篇文章的篇幅,去深入的講解Android圖形顯示的原理,OpenGL ES和Skia的繪制圖像的方式,他們?nèi)绾问褂茫约八麄冊贏ndroid中的使用場景,如開機動畫,Activity界面的軟件繪制和硬件繪制,以及Flutter的界面繪制。那么,我們開始對Android圖像顯示原理的探索吧。

在講解Android圖像的顯示之前,我會先講一下屏幕圖像的顯示原理,畢竟我們圖像,最終都是在手機屏幕上顯示出來的,了解這一塊的知識會讓我們更容易的理解Android在圖像顯示上的機制。

圖像顯示的完整過程,分為下面幾個階段:

圖像數(shù)據(jù)→CPU→顯卡驅(qū)動→顯卡(GPU)→顯存(幀緩沖)→顯示器

我詳細(xì)介紹一下這幾個階段:

實際上顯卡驅(qū)動,顯卡和顯存,包括數(shù)模轉(zhuǎn)換模塊都是屬于顯卡的模塊。但為了能能詳細(xì)的講解經(jīng)歷的步驟,這里做了拆分。

當(dāng)顯存中有數(shù)據(jù)后,顯示器又是怎么根據(jù)顯存里面的數(shù)據(jù)來進(jìn)行界面的顯示的呢?這里以LCD液晶屏為例,顯卡會將顯存里的數(shù)據(jù),按照從左至右,從上到下的順序同步到屏幕上的每一個像素晶體管,一個像素晶體管就代表了一個像素。

如果我們的屏幕分辨率是1080x1920像素,就表示有1080x1920個像素像素晶體管,每個橡素點的顏色越豐富,描述這個像素的數(shù)據(jù)就越大,比如單色,每個像素只需要1bit,16色時,只需要4bit,256色時,就需要一個字節(jié)。那么1080x1920的分辨率的屏幕下,如果要以256色顯示,顯卡至少需要1080x1920個字節(jié),也就是2M的大小。

剛剛說了,屏幕上的像素數(shù)據(jù)是從左到右,從上到下進(jìn)行同步的,當(dāng)這個過程完成了,就表示一幀繪制完成了,于是會開始下一幀的繪制,大部分的顯示屏都是以60HZ的頻率在屏幕上繪制完一幀,也就是16ms,并且每次繪制新的一幀時,都會發(fā)出一個垂直同步信號(VSync)。我們已經(jīng)知道,圖像數(shù)據(jù)都是放在幀緩沖中的,如果幀緩沖的緩沖區(qū)只有一個,那么屏幕在繪制這一幀的時候,圖像數(shù)據(jù)便沒法放入幀緩沖中了,只能等待這一幀繪制完成,在這種情況下,會有很大了效率問題。所以為了解決這一問題,幀緩沖引入兩個緩沖區(qū),即 雙緩沖機制 。雙緩沖雖然能解決效率問題,但會引入一個新的問題。當(dāng)屏幕這一幀還沒繪制完成時,即屏幕內(nèi)容剛顯示一半時,GPU 將新的一幀內(nèi)容提交到幀緩沖區(qū)并把兩個緩沖區(qū)進(jìn)行交換后,顯卡的像素同步模塊就會把新的一幀數(shù)據(jù)的下半段顯示到屏幕上,造成畫面撕裂現(xiàn)象。

為了解決撕裂問題,就需要在收到垂直同步的時候才將幀緩沖中的兩個緩沖區(qū)進(jìn)行交換。Android4.1黃油計劃中有一個優(yōu)化點,就是CPU和GPU都只有收到垂直同步的信號時,才會開始進(jìn)行圖像的繪制操作,以及緩沖區(qū)的交換工作。

我們已經(jīng)了解了屏幕圖像顯示的原理了,那么接著開始對Android圖像顯示的學(xué)習(xí)。

從上一章已經(jīng)知道,計算機渲染界面必須要有GPU和幀緩沖。對于Linux系統(tǒng)來說,用戶進(jìn)程是沒法直接操作幀緩沖的,但我們想要顯示圖像就必須要操作幀緩沖,所以Linux系統(tǒng)設(shè)計了一個虛擬設(shè)備文件,來作為對幀緩沖的映射,通過對該文件的I/O讀寫,我們就可以實現(xiàn)讀寫屏操作。幀緩沖對應(yīng)的設(shè)備文件于/dev/fb* ,*表示對多個顯示設(shè)備的支持, 設(shè)備號從0到31,如/dev/fb0就表示第一塊顯示屏,/dev/fb1就表示第二塊顯示屏。對于Android系統(tǒng)來說,默認(rèn)使用/dev/fb0這一個設(shè)幀緩沖作為主屏幕,也就是我們的手機屏幕。我們Android手機屏幕上顯示的圖像數(shù)據(jù),都是存儲在/dev/fb0里,早期AndroidStuio中的DDMS工具實現(xiàn)截屏的原理就是直接讀取/dev/fb0設(shè)備文件。

我們知道了手機屏幕上的圖形數(shù)據(jù)都存儲在幀緩沖中,所以Android手機圖像界面的原理就是將我們的圖像數(shù)據(jù)寫入到幀緩沖內(nèi)。那么,寫入到幀緩沖的圖像數(shù)據(jù)是怎么生成的,又是怎樣加工的呢?圖形數(shù)據(jù)是怎樣送到幀緩沖去的,中間經(jīng)歷了哪些步驟和過程呢?了解了這幾個問題,我們就了解了Android圖形渲染的原理,那么帶著這幾個疑問,接著往下看。

想要知道圖像數(shù)據(jù)是怎么產(chǎn)生的,我們需要知道 圖像生產(chǎn)者 有哪些,他們分別是如何生成圖像的,想要知道圖像數(shù)據(jù)是怎么被消費的,我們需要知道 圖像消費者 有哪些,他們又分別是如何消費圖像的,想要知道中間經(jīng)歷的步驟和過程,我們需要知道 圖像緩沖區(qū) 有哪些,他們是如何被創(chuàng)建,如何分配存儲空間,又是如何將數(shù)據(jù)從生產(chǎn)者傳遞到消費者的,圖像顯示是一個很經(jīng)典的消費者生產(chǎn)者的模型,只有對這個模型各個模塊的擊破,了解他們之間的流動關(guān)系,我們才能找到一條更容易的路徑去掌握Android圖形顯示原理。我們看看谷歌提供的官方的架構(gòu)圖是怎樣描述這一模型的模塊及關(guān)系的。

如圖, 圖像的生產(chǎn)者 主要有MediaPlayer,CameraPrevier,NDK,OpenGl ES。MediaPlayer和Camera Previer是通過直接讀取圖像源來生成圖像數(shù)據(jù),NDK(Skia),OpenGL ES是通過自身的繪制能力生產(chǎn)的圖像數(shù)據(jù); 圖像的消費者 有SurfaceFlinger,OpenGL ES Apps,以及HAL中的Hardware Composer。OpenGl ES既可以是圖像的生產(chǎn)者,也可以是圖像的消費者,所以它也放在了圖像消費模塊中; 圖像緩沖區(qū) 主要有Surface以及前面提到幀緩沖。

Android圖像顯示的原理,會僅僅圍繞 圖像的生產(chǎn)者 , 圖像的消費者 , 圖像緩沖區(qū) 來展開,在這一篇文章中,我們先看看Android系統(tǒng)中的圖像消費者。

SurfaceFlinger是Android系統(tǒng)中最重要的一個圖像消費者,Activity繪制的界面圖像,都會傳遞到SurfaceFlinger來,SurfaceFlinger的作用主要是接收圖像緩沖區(qū)數(shù)據(jù),然后交給HWComposer或者OpenGL做合成,合成完成后,SurfaceFlinger會把最終的數(shù)據(jù)提交給幀緩沖。

那么SurfaceFlinger是如何接收圖像緩沖區(qū)的數(shù)據(jù)的呢?我們需要先了解一下Layer(層)的概念,一個Layer包含了一個Surface,一個Surface對應(yīng)了一塊圖形緩沖區(qū),而一個界面是由多個Surface組成的,所以他們會一一對應(yīng)到SurfaceFlinger的Layer中。SurfaceFlinger通過讀取Layer中的緩沖數(shù)據(jù),就相當(dāng)于讀取界面上Surface的圖像數(shù)據(jù)。Layer本質(zhì)上是 Surface和SurfaceControl的組合 ,Surface是圖形生產(chǎn)者和圖像消費之間傳遞數(shù)據(jù)的緩沖區(qū),SurfaceControl是Surface的控制類。

前面在屏幕圖像顯示原理中講到,為了防止圖像的撕裂,Android系統(tǒng)會在收到VSync垂直同步時才會開始處理圖像的繪制和合成工作,而Surfaceflinger作為一個圖像的消費者,同樣也是遵守這一規(guī)則,所以我們通過源碼來看看SurfaceFlinger是如何在這一規(guī)則下,消費圖像數(shù)據(jù)的。

SurfaceFlinger專門創(chuàng)建了一個EventThread線程用來接收VSync。EventThread通過Socket將VSync信號同步到EventQueue中,而EventQueue又通過回調(diào)的方式,將VSync信號同步到SurfaceFlinger內(nèi)。我們看一下源碼實現(xiàn)。

上面主要是SurfaceFlinger初始化接收VSYNC垂直同步信號的操作,主要有這幾個過程:

經(jīng)過上面幾個步驟,我們接收VSync的初始化工作都準(zhǔn)備好了,EventThread也開始運轉(zhuǎn)了,接著看一下EventThread的運轉(zhuǎn)函數(shù)threadLoop做的事情。

threadLoop主要是兩件事情

mConditon又是怎么接收VSync的呢?我們來看一下

可以看到,mCondition的VSync信號實際是DispSyncSource通過onVSyncEvent回調(diào)傳入的,但是DispSyncSource的VSync又是怎么接收的呢?在上面講到的SurfaceFlinger的init函數(shù),在創(chuàng)建EventThread的實現(xiàn)中,我們可以發(fā)現(xiàn)答案—— mPrimaryDispSync 。

DispSyncSource的構(gòu)造方法傳入了mPrimaryDispSync,mPrimaryDispSync實際是一個DispSyncThread線程,我們看看這個線程的threadLoop方法

DispSyncThread的threadLoop會通過mPeriod來判斷是否進(jìn)行阻塞或者進(jìn)行VSync回調(diào),那么mPeriod又是哪兒被設(shè)置的呢?這里又回到SurfaceFlinger了,我們可以發(fā)現(xiàn)在SurfaceFlinger的 resyncToHardwareVsync 函數(shù)中有對mPeriod的賦值。

可以看到,這里最終通過HWComposer,也就是硬件層拿到了period。終于追蹤到了VSync的最終來源了, 它從HWCompser產(chǎn)生,回調(diào)至DispSync線程,然后DispSync線程回調(diào)到DispSyncSource,DispSyncSource又回調(diào)到EventThread,EventThread再通過Socket分發(fā)到MessageQueue中 。

我們已經(jīng)知道了VSync信號來自于HWCompser,但SurfaceFlinger并不會一直監(jiān)聽VSync信號,監(jiān)聽VSync的線程大部分時間都是休眠狀態(tài),只有需要做合成工作時,才會監(jiān)聽VSync,這樣即保證圖像合成的操作能和VSync保持一致,也節(jié)省了性能。SurfaceFlinger提供了一些主動注冊監(jiān)聽VSync的操作函數(shù)。

可以看到,只有當(dāng)SurfaceFlinger調(diào)用 signalTransaction 或者 signalLayerUpdate 函數(shù)時,才會注冊監(jiān)聽VSync信號。那么signalTransaction或者signalLayerUpdate什么時候被調(diào)用呢?它可以由圖像的生產(chǎn)者通知調(diào)用,也可以由SurfaceFlinger根據(jù)自己的邏輯來判斷是否調(diào)用。

現(xiàn)在假設(shè)App層已經(jīng)生成了我們界面的圖像數(shù)據(jù),并調(diào)用了 signalTransaction 通知SurfaceFlinger注冊監(jiān)聽VSync,于是VSync信號便會傳遞到了MessageQueue中了,我們接著看看MessageQueue又是怎么處理VSync的吧。

MessageQueue收到VSync信號后,最終回調(diào)到了SurfaceFlinger的 onMessageReceived 中,當(dāng)SurfaceFlinger接收到VSync后,便開始以一個圖像消費者的角色來處理圖像數(shù)據(jù)了。我們接著看SurfaceFlinger是以什么樣的方式消費圖像數(shù)據(jù)的。

VSync信號最終被SurfaceFlinger的onMessageReceived函數(shù)中的INVALIDATE模塊處理。

INVALIDATE的流程如下:

handleMessageTransaction的處理比較長,處理的事情也比較多,它主要做的事情有這些

handleMessageRefresh函數(shù),便是SurfaceFlinger真正處理圖層合成的地方,它主要下面五個步驟。

我會詳細(xì)介紹每一個步驟的具體操作

合成前預(yù)處理會判斷Layer是否發(fā)生變化,當(dāng)Layer中有新的待處理的Buffer幀(mQueuedFrames0),或者mSidebandStreamChanged發(fā)生了變化, 都表示Layer發(fā)生了變化,如果變化了,就調(diào)用signalLayerUpdate,注冊下一次的VSync信號。如果Layer沒有發(fā)生變化,便只會做這一次的合成工作,不會注冊下一次VSync了。

重建Layer棧會遍歷Layer,計算和存儲每個Layer的臟區(qū), 然后和當(dāng)前的顯示設(shè)備進(jìn)行比較,看Layer的臟區(qū)域是否在顯示設(shè)備的顯示區(qū)域內(nèi),如果在顯示區(qū)域內(nèi)的話說明該layer是需要繪制的,則更新到顯示設(shè)備的VisibleLayersSortedByZ列表中,等待被合成

rebuildLayerStacks中最重要的一步是 computeVisibleRegions ,也就是對Layer的變化區(qū)域和非透明區(qū)域的計算,為什么要對變化區(qū)域做計算呢?我們先看看SurfaceFlinger對界面顯示區(qū)域的分類:

還是以這張圖做例子,可以看到我們的狀態(tài)欄是半透明的,所以它是一個opaqueRegion區(qū)域,微信界面和虛擬按鍵是完全不透明的,他是一個visibleRegion,除了這三個Layer外,還有一個我們看不到的Layer——壁紙,它被上方visibleRegion遮擋了,所以是coveredRegion

對這幾個區(qū)域的概念清楚了,我們就可以去了解computeVisibleRegions中做的事情了,它主要是這幾步操作:

Flutter面試:渲染原理

頁面中的各界面元素(Widget)以樹的形式組織,即控件樹。Flutter通過控件樹中的每個控件創(chuàng)建不同類型的渲染對象,組成渲染對象樹。而渲染對象樹在Flutter的展示過程分為三個階段:布局、繪制、合成和渲染。

(一)布局

Flutter采用深度優(yōu)先機制遍歷渲染對象樹,決定渲染對象樹中各渲染對象在屏幕上的位置和尺寸。在布局過程中,渲染對象樹中的每個渲染對象都會接收父對象的布局約束參數(shù),決定自己的大小,然后父對象按照控件邏輯決定各個子對象的位置,完成布局過程。

為了防止因子節(jié)點發(fā)生變化而導(dǎo)致整個控件樹重新布局,F(xiàn)lutter加入了一個機制——布局邊界(Relayout Boundary),可以在某些節(jié)點自動或手動地設(shè)置布局邊界,當(dāng)邊界內(nèi)的任何對象發(fā)生重新布局時,不會影響邊界外的對象,反之亦然。

二)繪制

布局完成后,渲染對象樹中的每個節(jié)點都有了明確的尺寸和位置。Flutter會把所有的渲染對象繪制到不同的圖層上。與布局過程一樣,繪制過程也是深度優(yōu)先遍歷,而且總是先繪制自身,再繪制子節(jié)點。

以下圖為例:節(jié)點1在繪制完自身后,會再繪制節(jié)點2,然后繪制它的子節(jié)點3、4和5,最后繪制節(jié)點6。

可以看到,由于一些其他原因(比如,視圖手動合并)導(dǎo)致2的子節(jié)點5與它的兄弟節(jié)點6處于了同一層,這樣會導(dǎo)致當(dāng)節(jié)點2需要重繪的時候,與其無關(guān)的節(jié)點6也會被重繪,帶來性能損耗。

為了解決這一問題,F(xiàn)lutter提出了與布局邊界對應(yīng)的機制——重繪邊界(Repaint Boundary)。在重繪邊界內(nèi),F(xiàn)lutter會強制切換新的圖層,這樣就可以避免邊界內(nèi)外的互相影響,避免無關(guān)內(nèi)容置于同一圖層引起不必要的重繪。

重繪邊界的一個典型場景是Scrollview。ScrollView滾動的時候需要刷新視圖內(nèi)容,從而觸發(fā)內(nèi)容重繪。而當(dāng)滾動內(nèi)容重繪時,一般情況下其他內(nèi)容是不需要重繪的,這時候重繪邊界就派上用場了。

(三)合成和渲染

終端設(shè)備的頁面越來越復(fù)雜,因此Flutter的渲染樹層級通常很多,直接交付給渲染引擎進(jìn)行多圖層渲染,可能會出現(xiàn)大量渲染內(nèi)容的重復(fù)繪制,所以還需要先進(jìn)行一次圖層合成,即將所有的圖層根據(jù)大小、層級、透明度等規(guī)則計算出最終的顯示效果,將相同的圖層歸類合并,簡化渲染樹,提高渲染效率。

合并完成后,F(xiàn)lutter會將幾何圖層數(shù)據(jù)交由Skia引擎加工成二維圖像數(shù)據(jù),最終交由GPU進(jìn)行渲染,完成界面的展示。

四、總結(jié)

咱們從各種業(yè)界主流跨端方案與Flutter的對比開始,到Flutter的簡要介紹以及Flutter的運行機制,并以界面渲染過程為例,從布局、繪制、合成和渲染三個階段講述了Flutter的實現(xiàn)原理。相信大家對Flutter已經(jīng)有一個整體認(rèn)知,趕快一起上手操作起來吧!

Flutter性能優(yōu)化

1.圓角對性能的影響

盡量避免用Clipxxx組件,建議用BoxDecoration的image屬性實現(xiàn),如果用Clipxxx組件,圓角取整后性能會提升。

2.減少重繪

根據(jù)場景合理使用RePaintBoundary,使繪制獨立于父布局,避免重繪,提升性能,但過度使用增加的圖層會帶來Raster合成的耗時。例如scrollview是滑動過程會導(dǎo)致所有的節(jié)點都重繪,可以在scrollview下一層使用RePaintBoundary。

3.滾動步長插值器優(yōu)化(了解)

官方的滾動差值器在出現(xiàn)小卡頓時,滾動步長會出現(xiàn)大的跳躍,導(dǎo)致體感上出現(xiàn)很明顯的抖動,優(yōu)化步長偏移量算法與原生效果對齊。

4.開啟SurfaceView

官方推薦Flutter用SurfaceView ,因為SurfaceView與應(yīng)用窗口內(nèi)容分隔開,在專有硬件中合成,產(chǎn)生的中間副本少于TextureView,所以性能高,占用內(nèi)存少,但是在混合棧遇到的問題需要突破

5.使用RepaintBoundary 提升頻繁重繪控件的性能。使用RelayoutBoundary提升頻繁修改大小,增刪的布局中也可以提升性能。

6.build中不要去寫大量的耗時邏輯,因為數(shù)據(jù)更新會觸發(fā)build的多次調(diào)用,在里面做耗時邏輯會降低性能。

7.盡量使用statelessWidget代替statefulWidget,因為statefulWidget的銷毀重建會引起子widget的銷毀與重建。

8.解析json可以放到子線程線程中,開Isolate去解析,這樣,當(dāng)返回數(shù)據(jù)特別大的時候也不會阻塞界面。

9.使用不變的組件的時候可以添加const,const組件不會進(jìn)行build更新

10.由于flutter通過widget.runtimeType和key來判斷是否需要跟新組建,所以我們寫組件的時候盡量保持key不變,或者不寫key。對于一些需要頻繁改變,例如新增、刪除、排序的最好加上key。如果type一直,如果不寫key容易導(dǎo)致,element無法區(qū)分新舊widget,導(dǎo)致無法更新。

飄的英語單詞

en ,是小說飄???gone with the wind flutter 也有飄的意思 float也有 追問: 不是 米切爾 的小說,float是指流水的漂,fluttet多指鳥類,也不是drift。我要的是“飄”! 回答: unfettered 逍遙,也有你說的飄的意思吧 free應(yīng)該是最簡單的吧 leisurely也有這方面的意思 happy-go-lucky 現(xiàn)在網(wǎng) 上這個“ 合成詞 ”也是逍遙 at large 這個學(xué)過 新概念 的都知道,逍遙,飄的意思 餓,還有啥不滿意的

flutter 性能知識

ModalRoute中的參數(shù)maintainState。其意義為:已經(jīng)不可見(被上面的蓋住完全看不到啦~)的組件,是否還需要保存狀態(tài)。OverlayEntry類源碼中說maintainState設(shè)置為true是昂貴的,但是如果maintainState為false,那當(dāng)不可見時,對應(yīng)的頁面會被銷掉,如果pop回去時重新創(chuàng)建的(State 會跑initState方法),那上個頁面的狀態(tài)就無法保持了。這可能也是MaterialPageRoute默認(rèn)maintainState為true的原因。

這里的saveLayer()是說canvas的saveLayer()方法。一般用于合成特殊效果

可能觸發(fā) saveLayer() 并可能代價高昂的其他小部件:

避免調(diào)用 saveLayer() :

文章題目:flutter合成,flutter構(gòu)造函數(shù)
文章位置:http://aaarwkj.com/article30/dsiiiso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、面包屑導(dǎo)航靜態(tài)網(wǎng)站、服務(wù)器托管云服務(wù)器、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
午夜视频在线观看日韩| 精品久久亚洲一区二区欧美| 国产精品黄色片在线观看 | 色花堂国产精品第二页| 免费在线观看97视频| 欧美日韩专区一区二区三区| 久久成人a毛片免费观看网站| 91精品国产综合久蜜臂| 国产v精品欧美精品v日韩| 亚洲综合激情一区二区| 国产精品视频在线播放| 欧美日韩亚洲国产一区| 中文字幕在线日韩精品| 亚洲一区二区三区精品电影网| 久久免费少妇高潮99精品| 亚洲精品欧美综合二区| 久久这里只有精品热免费| 国产三级在线播放完整| 午夜激情在线观看网页| 亚洲欧美综合一区二区三区| 欧美日韩在线一区二区| 国产成人av中文字暮在线| 人妻精品中文字幕一区二区在线 | 成人影院视频在线播放| 天天操天天射夜夜撸| 日韩不卡的一区免费视频| 日韩欧美中文字幕在线等| 精品一区二区三区乱码中文| 女同蝴蝶在线看完整版| 日韩一二三区免费不卡视频| 国产亚洲精品精品国产亚洲| 亚洲免费一级黄色录像片| 91九色视频官网在线观看| 首页亚洲一区二区三区| 国产在线视频不卡一区| 亚洲香蕉av在线一区二区三区| 传媒在线免费观看视频| 亚洲高清有码在线观看| 日本av东京热在线播放| 白虎亚洲福利精品一区| 白白色手机视频免费看|