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

如何將HTML5性能發揮到極致

移動開發
HTML5作為新興領域越來越熱。然而在移動設備硬件性能弱于PC的背景下,對性能的需求顯得更為重要,而HTML5性能優化前與優化后有著極大的差別,如何優化才能提高性能,對此熟知的人很少。本文以LayaAir引擎為例,通過代碼示例詳細闡述如何利用引擎對HTML5作出性能的極致優化。

HTML5作為新興領域越來越熱。然而在移動設備硬件性能弱于PC的背景下,對性能的需求顯得更為重要,而HTML5性能優化前與優化后有著極大的差別,如何優化才能提高性能,對此熟知的人很少。本文以LayaAir引擎為例,通過代碼示例詳細闡述如何利用引擎對HTML5作出性能的極致優化。

[[205464]]

主題包括:

  • 代碼執行基本原理
  • 基準測試
  • 內存優化
  • 圖形渲染性能
  • 減少CPU使用量
  • 其他優化策略

第1節:代碼執行基本原理

LayaAir引擎支持AS3、TypeScript、JavaScript三種語言開發,然而無論是采用哪種開發語言,最終執行的都是JavaScript代碼。所有看到的畫面都是通過引擎繪制出來的,更新頻率取決于開發者指定的FPS,例如指定幀頻率為60FPS,則運行時每個幀的執行時間為六十分之一秒,所以幀速越高,視覺上感覺越流暢,60幀是滿幀。

由于實際運行環境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發者能夠決定的,開發者能作的是盡可能通過優化,在低端設備或低性能瀏覽器中,提升FPS幀速。

LayaAir引擎在每幀都會重繪,在性能優化時,除了關注每幀執行邏輯代碼帶來的CPU消耗,還需要注意每幀調用繪圖指令的數量以及GPU的紋理提交次數。

第2節:基準測試

LayaAir引擎內置的性能統計工具可用于基準測試,實時檢測當前性能。開發者可以使用laya.utils.Stat類,通過Stat.show() 顯示統計面板。具體編寫代碼如下例所示:

  • Stat.show(0,0); //AS3的面板調用寫法
  • Laya.Stat.show(0,0); //TS與JS的面板調用寫法

Canvas渲染的統計信息:

如何將 HTML5 性能發揮到極致

WebGL渲染的統計信息:

如何將 HTML5 性能發揮到極致

統計參數的意義:

FPS:

  • 每秒呈現的幀數(數字越高越好)。
  • 使用canvas渲染時,描述字段顯示為FPS(Canvas),使用WebGL渲染時,描述字段顯示為FPS(WebGL)。

Sprite:

  • 渲染節點數量(數字越低越好)。
  • Sprite統計所有渲染節點(包括容器),這個數字的大小會影響引擎節點遍歷,數據組織和渲染的次數。

DrawCall:

  • DrawCall在canvas和WebGL渲染下代表不同的意義(越少越好)。
  • Canvas下表示每幀的繪制次數,包括圖片、文字、矢量圖。盡量限制在100之下。
  • WebGL下表示渲染提交批次,每次準備數據并通知GPU渲染繪制的過程稱為1次DrawCall,在每1次DrawCall中除了在通知GPU的渲染上比較耗時之外,切換材質與shader也是非常耗時的操作。 DrawCall的次數是決定性能的重要指標,盡量限制在100之下。

Canvas:

三個數值 —— 每幀重繪的畫布數量 / 緩存類型為“normal”類型的畫布數量 / 緩存類型為“bitmap”類型的畫布數量”。

CurMem:僅限WebGL渲染,表示內存與顯存占用(越低越好)。

Shader:僅限WebGL渲染,表示每幀Shader提交次數。

無論是Canvas模式還是WebGL模式,我們都需要重點關注DrawCall,Sprite,Canvas這三個參數,然后針對性地進行優化。(參見“圖形渲染性能”)

第3節:內存優化

對象池

對象池,涉及到不斷重復使用對象。在初始化應用程序期間創建一定數量的對象并將其存儲在一個池中。對一個對象完成操作后,將該對象放回到池中,在需要新對象時可以對其進行檢索。

由于實例化對象成本很高,使用對象池重用對象可減少實例化對象的需求。還可以減少垃圾回收器運行的機會,從而提高程序的運行速度。

以下代碼演示使用

Laya.utils.Pool: 

  1. ar SPRITE_SIGN = 'spriteSign'
  2. var sprites = []; 
  3. function initialize() 
  4.     for (var i = 0; i < 1000; i++) 
  5.     { 
  6.         var sp = Pool.getItemByClass(SPRITE_SIGN, Sprite) 
  7.         sprites.push(sp); 
  8.         Laya.stage.addChild(sp); 
  9.     } 
  10. initialize(); 

在initialize中創建大小為1000的對象池。

以下代碼在當單擊鼠標時,將刪除顯示列表中的所有顯示對象,并在以后的其他任務中重復使用這些對象: 

  1. Laya.stage.on("click", this, function() 
  2.     var sp; 
  3.     for(var i = 0, len = sprites.length; i < len; i++) 
  4.     { 
  5.         sp = sprites.pop(); 
  6.         Pool.recover(SPRITE_SIGN, sp); 
  7.         Laya.stage.removeChild(sp); 
  8.     } 
  9. }); 

調用Pool.recover后,指定的對象會被回收至池內。

使用Handler.create

在開發過程中,會經常使用Handler來完成異步回調。Handler.create使用了內置對象池管理,因此在使用Handler對象時應使用Handler.create來創建回調處理器。以下代碼使用Handler.create創建加載的回調處理器:

  1. Laya.loader.load(urls, Handler.create(this, onAssetLoaded)); 

在上面的代碼中,回調被執行后Handler將會被對象池收回。此時,考慮如下代碼會發生什么事:

  1. Laya.loader.load(urls, Handler.create(this, onAssetLoaded), Handler.create(this, onLoading)); 

在上面的代碼中,使用Handler.create返回的處理器處理progress事件。此時的回調執行一次之后就被對象池回收,于是progress事件只觸發了一次,此時需要將四個名為once的參數設置為false:

  1. Laya.loader.load(urls, Handler.create(this, onAssetLoaded), Handler.create(this, onLoading, nullfalse)); 

釋放內存

JavaScript運行時無法啟動垃圾回收器。要確保一個對象能夠被回收,請刪除對該對象的所有引用。Sprite提供的destory會幫助設置內部引用為null。

例如,以下代碼確保對象能夠被作為垃圾回收: 

  1. var sp = new Sprite(); 
  2. sp.destroy(); 

當對象設置為null,不會立即將其從內存中刪除。只有系統認為內存足夠低時,垃圾回收器才會運行。內存分配(而不是對象刪除)會觸發垃圾回收。

垃圾回收期間可能占用大量CPU并影響性能。通過重用對象,嘗試限制使用垃圾回收。此外,盡可能將引用設置為null,以便垃圾回收器用較少時間來查找對象。有時(比如兩個對象相互引用),無法同時設置兩個引用為null,垃圾回收器將掃描無法被訪問到的對象,并將其清除,這會比引用計數更消耗性能。

資源卸載

游戲運行時總會加載許多資源,這些資源在使用完成后應及時卸載,否則一直殘留在內存中。

下例演示加載資源后對比資源卸載前和卸載后的資源狀態: 

  1. var assets = []; 
  2. assets.push("res/apes/monkey0.png"); 
  3. assets.push("res/apes/monkey1.png"); 
  4. assets.push("res/apes/monkey2.png"); 
  5. assets.push("res/apes/monkey3.png"); 
  6.  
  7. Laya.loader.load(assets, Handler.create(this, onAssetsLoaded)); 
  8.  
  9. function onAssetsLoaded() 
  10.     for(var i = 0, len = assets.length; i < len; ++i) 
  11.     { 
  12.         var asset = assets[i]; 
  13.         console.log(Laya.loader.getRes(asset)); 
  14.         Laya.loader.clearRes(asset); 
  15.         console.log(Laya.loader.getRes(asset)); 
  16.     } 

關于濾鏡、遮罩

嘗試盡量減少使用濾鏡效果。將濾鏡(BlurFilter和GlowFilter)應用于顯示對象時,運行時將在內存中創建兩張位圖。其中每個位圖的大小與顯示對象相同。將第一個位圖創建為顯示對象的柵格化版本,然后用于生成應用濾鏡的另一個位圖:

如何將 HTML5 性能發揮到極致
應用濾鏡時內存中的兩個位圖

當修改濾鏡的某個屬性或者顯示對象時,內存中的兩個位圖都將更新以創建生成的位圖,這兩個位圖可能會占用大量內存。此外,此過程涉及CPU計算,動態更新時將會降低性能(參見“圖形渲染性能 – 關于cacheAs)。

ColorFiter在Canvas渲染下需要計算每個像素點,而在WebGL下的GPU消耗可以忽略不計。

最佳的做法是,盡可能使用圖像創作工具創建的位圖來模擬濾鏡。避免在運行時中創建動態位圖,可以幫助減少CPU或GPU負載。特別是一張應用了濾鏡并且不會在修改的圖像。

第4節:圖形渲染性能

優化Sprite

  1. 盡量減少不必要的層次嵌套,減少Sprite數量。
  2. 非可見區域的對象盡量從顯示列表移除或者設置visible=false。
  3. 對于容器內有大量靜態內容或者不經常變化的內容(比如按鈕),可以對整個容器設置cacheAs屬性,能大量減少Sprite的數量,顯著提高性能。如果有動態內容,最好和靜態內容分開,以便只緩存靜態內容。
  4. Panel內,會針對panel區域外的直接子對象(子對象的子對象判斷不了)進行不渲染處理,超出panel區域的子對象是不產生消耗的。

優化DrawCall

  1. 對復雜靜態內容設置cacheAs,能大量減少DrawCall,使用好cacheAs是游戲優化的關鍵。
  2. 盡量保證同圖集的圖片渲染順序是挨著的,如果不同圖集交叉渲染,會增加DrawCall數量。
  3. 盡量保證同一個面板中的所有資源用一個圖集,這樣能減少提交批次。

優化Canvas

在對Canvas優化時,我們需要注意,在以下場合不要使用cacheAs:

  1. 對象非常簡單,比如一個字或者一個圖片,設置cacheAs=bitmap不但不提高性能,反而會損失性能。
  2. 容器內有經常變化的內容,比如容器內有一個動畫或者倒計時,如果再對這個容器設置cacheAs=bitmap,會損失性能。

可以通過查看Canvas統計信息的第一個值,判斷是否一直在刷新Canvas緩存。

關于cacheAs

設置cacheAs可將顯示對象緩存為靜態圖像,當cacheAs時,子對象發生變化,會自動重新緩存,同時也可以手動調用reCache方法更新緩存。 建議把不經常變化的復雜內容,緩存為靜態圖像,能極大提高渲染性能,cacheAs有”none”,”normal”和”bitmap”三個值可選。

  1. 默認為”none”,不做任何緩存。
  2. 當值為”normal”時,canvas下進行畫布緩存,webgl模式下進行命令緩存。
  3. 當值為”bitmap”時,canvas下進行依然是畫布緩存,webGL模式下使用renderTarget緩存。這里需要注意的是,webGL下renderTarget緩存模式有2048大小限制,超出2048會額外增加內存開銷。另外,不斷重繪時開銷也比較大,但是會減少drawcall,渲染性能最高。 webGL下命令緩存模式只會減少節點遍歷及命令組織,不會減少drawcall,性能中等。

設置cacheAs后,還可以設置staticCache=true以阻止自動更新緩存,同時可以手動調用reCache方法更新緩存。

cacheAs主要通過兩方面提升性能。一是減少節點遍歷和頂點計算;二是減少drawCall。善用cacheAs將是引擎優化性能的利器。

下例繪制10000個文本: 

  1. Laya.init(550, 400, Laya.WebGL); 
  2. Laya.Stat.show(); 
  3.  
  4. var textBox = new Laya.Sprite(); 
  5.  
  6. var text; 
  7. for (var i = 0; i < 10000; i++) 
  8.     text = new Laya.Text(); 
  9.     text.text = (Math.random() * 100).toFixed(0); 
  10.     text.color = "#CCCCCC"
  11.  
  12.     text.x = Math.random() * 550; 
  13.     text.y = Math.random() * 400; 
  14.  
  15.     textBox.addChild(text); 
  16.  
  17. Laya.stage.addChild(textBox); 

下面是筆者電腦上的運行時截圖,FPS穩定于52上下。

如何將 HTML5 性能發揮到極致

當我們對文字所在的容器設置為cacheAs之后,如下面的例子所示,性能獲得較大的提升,FPS達到到了60幀。 

  1. // …省略其他代碼… var textBox = new Laya.Sprite(); 
  2. textBox.cacheAs = "bitmap"; // …省略其他代碼… 

 如何將 HTML5 性能發揮到極致

文字描邊

在運行時,設置了描邊的文本比沒有描邊的文本多調用一次繪圖指令。此時,文本對CPU的使用量和文本的數量成正比。因此,盡量使用替代方案來完成同樣的需求。

對于幾乎不變動的文本內容,可以使用cacheAs降低性能消耗,參見“圖形渲染性能 – 關于cacheAs”。

對于內容經常變動,但是使用的字符數量較少的文本域,可以選擇使用位圖字體。

跳過文本排版,直接渲染

大多數情況下,很多文本都不需要復雜的排版,僅僅簡單地顯示一行字。為了迎合這一需求,Text提供的名為changeText的方法可以直接跳過排版。 

  1. var text = new Text(); 
  2. text.text = "text"
  3. Laya.stage.addChild(text); 
  4. //后面只是更新文字內容,使用changeText能提高性能 
  5. text.changeText("text changed."); 

 Text.changeText會直接修改繪圖指令中該文本繪制的最后一條指令,這種前面的繪圖指令依舊存在的行為會導致changeText只使用于以下情況:

  • 文本始終只有一行。
  • 文本的樣式始終不變(顏色、粗細、斜體、對齊等等)。

即使如此,實際編程中依舊會經常使用到這樣的需要。

第5節:減少CPU使用量

減少動態屬性查找

JavaScript中任何對象都是動態的,你可以任意地添加屬性。然而,在大量的屬性里查找某屬性可能很耗時。如果需要頻繁使用某個屬性值,可以使用局部變量來保存它: 

  1. function foo() 
  2.     var prop = target.prop; 
  3.     // 使用prop 
  4.     process1(prop); 
  5.     process2(prop); 
  6.     process3(prop); 

 計時器

LayaAir提供兩種計時器循環來執行代碼塊。

  • Laya.timer.frameLoop執行頻率依賴于幀頻率,可通過Stat.FPS查看當前幀頻。
  • Laya.timer.loop執行頻率依賴于參數指定時間。

當一個對象的生命周期結束時,記得清除其內部的Timer: 

  1. Laya.timer.frameLoop(1, this, animateFrameRateBased); 
  2. Laya.stage.on("click", this, dispose); 
  3. function dispose()  
  4.     Laya.timer.clear(this, animateFrameRateBased); 

獲取顯示對象邊界的做法

在相對布局中,很經常需要正確地獲取顯示對象的邊界。獲取顯示對象的邊界也有多種做法,而其間差異很有必要知道。

1.使用getBounds/ getGraphicBounds。、 

  1. var sp = new Sprite(); 
  2. sp.graphics.drawRect(0, 0, 100, 100, "#FF0000"); 
  3. var bounds = sp.getGraphicBounds(); 
  4. Laya.stage.addChild(sp); 

getBounds可以滿足多數多數需求,但由于其需要計算邊界,不適合頻繁調用。

2.設置容器的autoSize為true。 

  1. var sp = new Sprite(); 
  2. sp.autoSize = true
  3. sp.graphics.drawRect(0, 0, 100, 100, "#FF0000"); 
  4. Laya.stage.addChild(sp); 

上述代碼可以在運行時正確獲取寬高。autoSize在獲取寬高并且顯示列表的狀態發生改變時會重新計算(autoSize通過getBoudns計算寬高)。所以對擁有大量子對象的容器應用autoSize是不可取的。如果設置了size,autoSize將不起效。

使用loadImage后獲取寬高: 

  1. var sp = new Sprite(); 
  2. sp.loadImage("res/apes/monkey2.png", 0, 0, 0, 0, Handler.create(this, function() 
  3.     console.log(sp.width, sp.height); 
  4. })); 
  5. Laya.stage.addChild(sp); 

loadImage在加載完成的回調函數觸發之后才可以正確獲取寬高。

3.直接調用size設置: 

  1. Laya.loader.load("res/apes/monkey2.png", Handler.create(this, function() 
  2.     var texture = Laya.loader.getRes("res/apes/monkey2.png"); 
  3.     var sp = new Sprite(); 
  4.     sp.graphics.drawTexture(texture, 0, 0); 
  5.     sp.size(texture.width, texture.height); 
  6.     Laya.stage.addChild(sp); 
  7. })); 

使用Graphics.drawTexture并不會自動設置容器的寬高,但是可以使用Texture的寬高賦予容器。毋庸置疑,這是最高效的方式。

注:getGraphicsBounds用于獲取矢量繪圖寬高。

根據活動狀態改變幀頻

幀頻有三種模式,Stage.FRAME_SLOW維持FPS在30;Stage.FRAME_FAST維持FPS在60;Stage.FRAME_MOUSE則選擇性維持FPS在30或60幀。

有時并不需要讓游戲以60FPS的速率執行,因為30FPS已經能夠滿足多數情況下人類視覺的響應,但是鼠標交互時,30FPS可能會造成畫面的不連貫,于是Stage.FRAME_MOUSE應運而生。

下例展示以Stage.FRAME_SLOW的幀率,在畫布上移動鼠標,使圓球跟隨鼠標移動: 

  1. Laya.init(Browser.width, Browser.height); 
  2. Stat.show(); 
  3. Laya.stage.frameRate = Stage.FRAME_SLOW; 
  4.  
  5. var sp = new Sprite(); 
  6. sp.graphics.drawCircle(0, 0, 20, "#990000"); 
  7. Laya.stage.addChild(sp); 
  8.  
  9. Laya.stage.on(Event.MOUSE_MOVE, this, function() 
  10.     sp.pos(Laya.stage.mouseX, Laya.stage.mouseY); 
  11. }); 

 如何將 HTML5 性能發揮到極致

此時FPS顯示30,并且在鼠標移動時,可以感覺到圓球位置的更新不連貫。設置Stage.frameRate為Stage.FRAME_MOUSE:

  1. Laya.stage.frameRate = Stage.FRAME_MOUSE; 

 如何將 HTML5 性能發揮到極致

此時在鼠標移動后FPS會顯示60,并且畫面流暢度提升。在鼠標靜止2秒不動后,FPS又會恢復到30幀。

使用callLater

callLater使代碼塊延遲至本幀渲染前執行。如果當前的操作頻繁改變某對象的狀態,此時可以考慮使用callLater,以減少重復計算。

考慮一個圖形,對它設置任何改變外觀的屬性都將導致圖形重繪: 

  1. var rotation = 0, 
  2.     scale = 1, 
  3.     position = 0; 
  4.  
  5. function setRotation(value) 
  6.     this.rotation = value; 
  7.     update(); 
  8.  
  9. function setScale(value) 
  10.     this.scale = value; 
  11.     update(); 
  12.  
  13. function setPosition(value) 
  14.     this.position = value; 
  15.     update(); 
  16.  
  17. function update() 
  18.     console.log('rotation: ' + this.rotation + '\tscale: ' + this.scale + '\tposition: ' + position); 

調用以下代碼更改狀態:

  1. setRotation(90); setScale(2); setPosition(30); 

控制臺的打印結果是 

  1. rotation: 90 scale: 1 position: 0  
  2. rotation: 90 scale: 2 position: 0  
  3. rotation: 90 scale: 2 position: 30 

update被調用了三次,并且最后的結果是正確的,但是前面兩次調用都是不需要的。

嘗試將三處update改為:

  1. Laya.timer.callLater(this, update); 

此時,update只會調用一次,并且是我們想要的結果。

圖片/圖集加載

在完成圖片/圖集的加載之后,引擎就會開始處理圖片資源。如果加載的是一張圖集,會處理每張子圖片。如果一次性處理大量的圖片,這個過程可能會造成長時間的卡頓。

在游戲的資源加載中,可以將資源按照關卡、場景等分類加載。在同一時間處理的圖片越少,當時的游戲響應速度也會更快。在資源使用完成后,也可以予以卸載,釋放內存。

第6節:其他優化策略

  1. 減少粒子使用數量,在移動平臺Canvas模式下,盡量不用粒子;
  2. 在Canvas模式下,盡量減少旋轉,縮放,alpha等屬性的使用,這些屬性會對性能產生消耗。(在WebGL模式可以使用);
  3. 不要在timeloop里面創建對象及復雜計算;
  4. 盡量減少對容器的autoSize的使用,減少getBounds()的使用,因為這些調用會產生較多計算;
  5. 盡量少用try catch的使用,被try catch的函數執行會變得非常慢;
責任編輯:未麗燕 來源: 極客頭條
相關推薦

2015-11-11 14:38:18

2022-05-31 10:57:56

數據庫云原生

2017-12-01 21:41:41

數據處理

2011-05-06 15:53:06

打印機性能

2009-07-10 13:52:16

虛擬化數據中心英特爾

2016-04-21 21:01:05

2021-04-12 10:47:41

聯想啟天M540

2020-04-07 14:40:19

Java并發編程多線程

2013-04-17 14:27:16

物聯網俠諾無線網絡

2014-07-09 15:45:50

寬帶

2013-10-16 10:20:20

2012-05-09 12:18:14

HTML5Canvas

2024-02-26 08:28:24

Java線程CPU

2011-02-25 10:19:23

ibmdwHTML5Web開發

2010-05-17 14:48:27

統一通信服務

2013-03-06 16:14:16

UCHTML5游戲引擎

2009-12-01 09:16:43

Windows 7英特爾聯盟

2011-05-04 09:29:22

2015-01-05 09:37:01

HTML5原生app拼積木方式

2009-06-22 16:19:27

無線路由器產品華碩
點贊
收藏

51CTO技術棧公眾號

久久精品三级| 91欧美日韩在线| 国产精品美女久久久久久久久久久| 国产经典一区二区| 在线免费观看视频| 国产a亚洲精品| 亚洲欧洲www| 国产精品二区在线| 一级做a爰片久久毛片| 精品国产一区二区三区香蕉沈先生| 日韩欧美高清在线视频| 亚洲视频sss| 免费国产精品视频| 日韩和欧美一区二区| 大胆欧美人体视频| 99久久人妻无码中文字幕系列| 成人日韩在线观看| 亚洲一区二区三区四区五区黄 | 久久久久久久久影院| gogogo高清在线观看一区二区| 欧美一级久久久久久久大片| 欧美视频免费播放| h片在线观看网站| 久久先锋影音av鲁色资源网| 91av免费看| 中文字幕永久在线| 国内精品久久久久久久影视蜜臀 | 在线亚洲一区观看| 日韩免费在线观看av| 你懂的视频在线播放| 国产剧情一区二区| 国产精品成人av性教育| 国产真实乱偷精品视频| 日韩国产一区| 亚洲精品视频免费| 亚洲精品久久一区二区三区777 | 韩国亚洲精品| 日韩中文字幕精品| 30一40一50老女人毛片| 亚洲一区二区免费在线观看| 欧美色男人天堂| 日本福利视频在线| 欧美aaaxxxx做受视频| 中文字幕亚洲欧美在线不卡| 久久久久久久久久久一区| 国产色视频在线| 美日韩一区二区三区| 992tv在线成人免费观看| 亚洲av鲁丝一区二区三区 | 91免费视频黄| 丁香在线视频| 久久精品人人爽人人爽| 精品亚洲一区二区三区四区五区高| 99热这里是精品| 久久99深爱久久99精品| 国产精品99免视看9| 97久久久久久久| 亚洲精品字幕| 久久人人看视频| 国产一级做a爱免费视频| 一区二区三区毛片免费| 久久久精品在线观看| 国产精品69久久久久孕妇欧美| 美女网站一区| 亚洲跨种族黑人xxx| 无码人妻aⅴ一区二区三区| 精品在线网站观看| 亚洲国产精彩中文乱码av在线播放 | 国产一区二区三区无遮挡 | 在线日韩av永久免费观看| 成年人视频网站在线| 国产拍欧美日韩视频二区| 清纯唯美一区二区三区| av网页在线| 国产精品福利一区| 香蕉视频在线网址| 91国内在线| 亚洲综合色在线| 毛片在线视频播放| 丝袜诱惑一区二区| 一本色道a无线码一区v| 成年人在线观看视频免费| 99riav视频一区二区| 欧美日韩国产另类一区| 91网址在线观看精品| 亚洲一区二区电影| 日韩电影在线观看中文字幕| 国产熟妇久久777777| 色135综合网| 欧美精品一区三区| 日韩成人高清视频| 噜噜噜在线观看免费视频日韩| 国产精品黄色av| 精品毛片一区二区三区| 成人黄页毛片网站| 欧美日本韩国国产| 日本中文字幕电影在线免费观看| 亚洲激情网站免费观看| 黄页网站在线观看视频| 色8久久影院午夜场| 在线不卡一区二区| 性欧美18—19sex性高清| 香蕉久久精品| 精品激情国产视频| 97免费在线观看视频| 日本91福利区| 国产精品久久久久久免费观看| 国产综合在线观看| 亚洲欧美日韩综合aⅴ视频| 蜜桃传媒一区二区三区| 免费成人毛片| 亚洲国产日韩欧美在线99| 自拍偷拍你懂的| 一区在线免费| 国产精品一区二区三区毛片淫片| 亚洲av永久纯肉无码精品动漫| 久久精品视频在线免费观看| 97久久国产亚洲精品超碰热| 日本综合视频| 亚洲国产精品小视频| 99re6热在线精品视频| 最新成人av网站| 成人av在线亚洲| 日韩精品系列| 亚洲人妖av一区二区| 成人性做爰aaa片免费看不忠| 色悠久久久久综合先锋影音下载| 一区二区中文字幕| 黄网在线观看视频| 国产精品夜夜嗨| 手机成人在线| 亚洲v.com| 精品国产乱码久久久久久闺蜜| 女教师淫辱の教室蜜臀av软件| 午夜综合激情| 国产激情一区二区三区在线观看| 久操免费在线| 欧美日韩视频在线观看一区二区三区 | 亚洲欧美日韩图片| 久久久久香蕉视频| 久久99精品久久久久久动态图| 久久免费一区| av成人 com a| 精品久久久久av影院| 国产大屁股喷水视频在线观看| 天堂蜜桃一区二区三区| 国产欧美日韩伦理| 大香伊人中文字幕精品| 日韩三级视频在线观看| 国产极品美女在线| 激情综合网最新| 亚洲三级一区| 久久精品 人人爱| 最新69国产成人精品视频免费| 亚洲欧美一区二区三区在线观看| 97se亚洲国产综合自在线观| 3d动漫一区二区三区| 国产图片一区| 91av视频在线| 男男激情在线| 在线观看不卡一区| 人妻互换一区二区激情偷拍| 青青草伊人久久| 日韩欧美在线电影| 国产91亚洲精品久久久| 日韩中文字幕网站| 91av久久久| 1000部国产精品成人观看| 五月天激情播播| 亚洲国产一区二区三区在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 久草免费在线观看| 欧美本精品男人aⅴ天堂| 欧美日韩国产精品一区二区三区| 国产大陆精品国产| 人妻少妇精品无码专区二区| 台湾亚洲精品一区二区tv| 97视频在线观看网址| 日本在线视频1区| 欧美综合亚洲图片综合区| 潮喷失禁大喷水aⅴ无码| 激情欧美日韩一区二区| 久久久久久久香蕉| 天海翼精品一区二区三区| 国产精品91久久久久久| 日韩av中文| 亚洲成avwww人| 久久久成人免费视频| 国产精品三级久久久久三级| 五月天婷婷在线观看视频| 欧美日韩p片| 蜜桃传媒视频麻豆一区| 久久亚洲精品人成综合网| 欧美精品在线网站| 五月天婷婷社区| 在线免费视频一区二区| 欧美做爰啪啪xxxⅹ性| 99视频一区二区| 性欧美videossex精品| 欧美高清一区| 欧美日韩国产免费一区二区三区 | wwwxx欧美| 国产精品av一区二区三区| 日韩中文字幕久久| 少妇精品高潮欲妇又嫩中文字幕 | 欧美精品激情视频| 免费理论片在线观看播放老| 欧美疯狂性受xxxxx喷水图片| 日本污视频在线观看| 国产欧美日韩另类一区| 免费黄色在线播放| 人人狠狠综合久久亚洲| 美女扒开大腿让男人桶| 日韩av片子| 国产亚洲欧美一区二区三区| 精品久久99| 国外成人性视频| 成人在线观看亚洲| 亚洲欧美精品伊人久久| www.97av| 欧美日本一区二区三区四区| 国产精品国产三级国产专区52| 亚洲欧洲在线观看av| 欧美性xxxx图片| 国产91精品一区二区麻豆亚洲| 男女污污的视频| 99精品国产在热久久| 欧美日韩dvd| 天天插综合网| 日韩一本精品| 五月激激激综合网色播| 国产精品一区二区三区精品| 亚洲人体在线| 国产成人小视频在线观看| 91黄页在线观看| 欧美成人精品三级在线观看| av大片在线看| 亚洲一二在线观看| 日夜干在线视频| 精品国产百合女同互慰| 国产视频第一页| 欧美日韩亚州综合| 日本黄色一级视频| 色综合天天狠狠| 亚洲黄色三级视频| 一区二区三区免费网站| 国产福利视频网站| 中文字幕日韩一区二区| 极品尤物一区二区| 欧美精彩视频一区二区三区| 亚洲av无码一区二区二三区| 99久久精品免费| 国产精品手机在线观看| 国产v日产∨综合v精品视频| 亚洲丝袜在线观看| 国产一区二区三区四区在线观看| 最新天堂在线视频| 久久99国产精品尤物| 91女神在线观看| 另类小说综合欧美亚洲| 中文字幕亚洲乱码| 久久精品国产77777蜜臀| 天天干天天玩天天操| 美女视频黄久久| 视频二区在线播放| 国内精品久久久久影院一蜜桃| 亚洲一区二区三区观看| 韩国视频一区二区| 三大队在线观看| 国产精品中文字幕日韩精品 | 特级西西444www高清大视频| 色噜噜久久综合| 中国黄色一级视频| 51精品久久久久久久蜜臀| 国产超碰人人模人人爽人人添| 日韩你懂的电影在线观看| 欧美一级淫片免费视频魅影视频| 亚洲国产日韩欧美在线动漫| 久青青在线观看视频国产| 伊人伊成久久人综合网小说| 欧美极品另类| 欧美肥婆姓交大片| 中文在线а√在线8| 国产精品久久久久久亚洲调教 | 亚洲女同同性videoxma| 国产天堂在线播放| 精品一区二区免费视频| jjzz黄色片| 久久精品亚洲精品国产欧美kt∨ | 在线电影一区二区| 久久国产午夜精品理论片最新版本| 午夜亚洲一区| av免费一区二区| 成人激情文学综合网| 18精品爽国产三级网站| 亚洲一区二区三区四区五区黄| www.国产com| 3atv一区二区三区| 熟妇人妻av无码一区二区三区| 中文字幕日韩av电影| 丰满的护士2在线观看高清| 日韩av大片在线| 日韩高清一区| 日本三级中国三级99人妇网站| 在线观看免费一区二区| 无码精品国产一区二区三区免费| 久久99精品国产91久久来源| 精品一区二区视频在线观看| 国产精品成人一区二区艾草 | 激情成人四房播| 国产91精品不卡视频| 亚洲色图综合| 久久久久久久久一区| 你懂的一区二区| 能在线观看的av网站| 风流少妇一区二区| 色偷偷男人天堂| 色婷婷综合久久久中文字幕| 亚洲精品视频网| 日韩在线观看网站| 欧美天堂视频| 狠狠色噜噜狠狠色综合久| 一区二区三区午夜视频| 精品久久久久久久无码| 99久久精品99国产精品| 欧美黄色一区二区三区| 欧美日韩一卡二卡| 嫩草研究院在线| 97人人做人人爱| 日韩激情综合| 国产对白在线播放| 免费在线看成人av| 六月婷婷七月丁香| 欧美日韩中文在线| 日韩有码第一页| 欧美黑人国产人伦爽爽爽| 亚洲免费看片| 亚洲一区二区自拍偷拍| 日韩精品一二三| 亚洲午夜久久久久久久久红桃 | 欧美成人一区二区视频| 日韩精品视频在线观看免费| 欧美1—12sexvideos| 亚洲一区二区三区四区在线播放| 日韩精品欧美激情一区二区| 欧美激情精品久久久久久小说| 99在线视频精品| 日本网站在线免费观看| 亚洲成人性视频| а√天堂中文在线资源8| 成人国产精品av| 国产精品传媒精东影业在线| 久久久久久久久久久久91| 国产欧美日韩精品a在线观看| 无码人妻av一区二区三区波多野 | 高h视频在线观看| 国产在线999| 亚洲h色精品| 中文字幕第10页| 一区二区激情视频| 成人免费视频国产免费麻豆| 欧美激情xxxx性bbbb| 国产精品白浆| 成人综合视频在线| 久久尤物电影视频在线观看| 无码人妻丰满熟妇奶水区码| 一本色道久久88综合亚洲精品ⅰ| 亚洲日本在线观看视频| 污视频在线免费观看一区二区三区| 免费的成人av| 东方av正在进入| 亚洲第一网站免费视频| 亚洲欧美韩国| 亚洲精品日韩在线观看| 国产在线视频一区二区| 麻豆changesxxx国产| 亚洲成色999久久网站| 香蕉视频亚洲一级| 这里只有精品66| 国产a区久久久| 精品人妻无码一区二区性色| 在线精品视频视频中文字幕| 亚州精品国产| 国产黄色片免费在线观看| 久久综合久色欧美综合狠狠| 影音先锋黄色网址| 色综合视频一区中文字幕| 最新亚洲精品| 九九九九九九九九| 五月婷婷久久丁香| 99re热久久这里只有精品34| 亚洲一区二区三区sesese| 国产深夜精品| 国产精品69久久久久孕妇欧美| 精品国偷自产国产一区| 88xx成人永久免费观看| 无码毛片aaa在线| www激情久久| 午夜精品一区二区三| 国产国语videosex另类|