午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 淺談利用緩存來優化HTML5 Canvas程序的性能

淺談利用緩存來優化HTML5 Canvas程序的性能

熱門標簽:申請400電話流程簡介 外呼線穩定線路 邢臺縣地圖標注app 南通數據外呼系統推廣 阜陽企業外呼系統 外呼系統電話怎么投訴 地圖標注位置能賺錢嗎 pageadm實現地圖標注 呼和浩特外呼電銷系統排名

canvas玩多了后,就會自動的要開始考慮性能問題了。怎么優化canvas的動畫呢?

  【使用緩存】

  使用緩存也就是用離屏canvas進行預渲染了,原理很簡單,就是先繪制到一個離屏canvas中,然后再通過drawImage把離屏canvas畫到主canvas中。可能看到這很多人就會誤解,這不是寫游戲里面用的很多的雙緩沖機制么?

  其實不然,雙緩沖機制是游戲編程中為了防止畫面閃爍,因此會有一個顯示在用戶面前的畫布以及一個后臺畫布,進行繪制時會先將畫面內容繪制到后臺畫布中,再將后臺畫布里的數據繪制到前臺畫布中。這就是雙緩沖,但是canvas中是沒有雙緩沖的,因為現代瀏覽器基本上都是內置了雙緩沖機制。所以,使用離屏canvas并不是雙緩沖,而是把離屏canvas當成一個緩存區。把需要重復繪制的畫面數據進行緩存起來,減少調用canvas的API的消耗。

  眾所周知,調用canvas的API很消耗性能,所以,當我們要繪制一些重復的畫面數據時,妥善利用離屏canvas對性能方面有很大的提升,可以看下下面的DEMO

  1 、 沒使用緩存   

  2、  使用了緩存但是沒有設置離屏canvas的寬高  

      3 、 使用了緩存但是沒有設置離屏canvas的寬高  

  4 、 使用了緩存且設置了離屏canvas的寬高

  可以看到上面的DEMO的性能不一樣,下面分析一下原因:為了實現每個圈的樣式,所以繪制圈圈時我用了循環繪制,如果沒用啟用緩存,當頁面的圈圈數量達到一定時,動畫每一幀就要大量調用canvas的API,要進行大量的計算,這樣再好的瀏覽器也會被拖垮啦。
XML/HTML Code復制內容到剪貼板

  1. ctx.save();   
  2.                         var j=0;   
  3.                         ctx.lineWidth = borderWidth;   
  4.                         for(var i=1;i<this.r;i+=borderWidth){   
  5.                             ctx.beginPath();   
  6.                             ctx.strokeStyle = this.color[j];   
  7.                             ctx.arc(this.x , this.y , i , 0 , 2*Math.PI);   
  8.                             ctx.stroke();   
  9.                             j++;   
  10.                         }   
  11.                         ctx.restore();  

  所以,我的方法很簡單,每個圈圈對象里面給他一個離屏canvas作緩存區。

  除了創建離屏canvas作為緩存之外,下面的代碼中有一點很關鍵,就是要設置離屏canvas的寬度和高度,canvas生成后的默認大小是300X150;對于我的代碼中每個緩存起來圈圈對象半徑最大也就不超過80,所以300X150的大小明顯會造成很多空白區域,會造成資源浪費,所以就要設置一下離屏canvas的寬度和高度,讓它跟緩存起來的元素大小一致,這樣也有利于提高動畫性能。上面的四個demo很明顯的顯示出了性能差距,如果沒有設置寬高,當頁面超過400個圈圈對象時就會卡的不行了,而設置了寬高1000個圈圈對象也不覺得卡。

XML/HTML Code復制內容到剪貼板
  1. var ball = function(x , y , vx , vy , useCache){   
  2.                 this.x = x;   
  3.                 this.y = y;   
  4.                 this.vx = vx;   
  5.                 this.vy = vy;   
  6.                 this.r = getZ(getRandom(20,40));   
  7.                 this.color = [];   
  8.                 this.cacheCanvas = document.createElement("canvas");   
  9.                 thisthis.cacheCtx = this.cacheCanvas.getContext("2d");   
  10.                 this.cacheCanvas.width = 2*this.r;   
  11.                 this.cacheCanvas.height = 2*this.r;   
  12.                 var num = getZ(this.r/borderWidth);   
  13.                 for(var j=0;j<num;j++){   
  14.                     this.color.push("rgba("+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+",1)");   
  15.                 }   
  16.                 this.useCache = useCache;   
  17.                 if(useCache){   
  18.                     this.cache();   
  19.                 }   
  20.             }  

 

當我實例化圈圈對象時,直接調用緩存方法,把復雜的圈圈直接畫到圈圈對象的離屏canvas中保存起來。

XML/HTML Code復制內容到剪貼板
  1. cache:function(){   
  2.                     this.cacheCtx.save();   
  3.                     var j=0;   
  4.                     this.cacheCtx.lineWidth = borderWidth;   
  5.                     for(var i=1;i<this.r;i+=borderWidth){   
  6.                         this.cacheCtx.beginPath();   
  7.                         thisthis.cacheCtx.strokeStyle = this.color[j];   
  8.                         this.cacheCtx.arc(this.r , this.r , i , 0 , 2*Math.PI);   
  9.                         this.cacheCtx.stroke();   
  10.                         j++;   
  11.                     }   
  12.                     this.cacheCtx.restore();   
  13.                 }  

然后在接下來的動畫中,我只需要把圈圈對象的離屏canvas畫到主canvas中,這樣,每一幀調用的canvasAPI就只有這么一句話:

XML/HTML Code復制內容到剪貼板
  1. ctx.drawImage(this.cacheCanvas , this.x-this.r , this.y-this.r);  

跟之前的for循環繪制比起來,實在是快太多了。所以當需要重復繪制矢量圖的時候或者繪制多個圖片的時候,我們都可以合理利用離屏canvas來預先把畫面數據緩存起來,在接下來的每一幀中就能減少很多沒必要的消耗性能的操作。

下面貼出1000個圈圈對象流暢版代碼:
  

XML/HTML Code復制內容到剪貼板
  1. <!doctype html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <style>  
  6.         body{   
  7.             padding:0;   
  8.             margin:0;   
  9.             overflow: hidden;   
  10.         }   
  11.         #cas{   
  12.             display: block;   
  13.             background-color:rgba(0,0,0,0);   
  14.             margin:auto;   
  15.             border:1px solid;   
  16.         }   
  17.     </style>  
  18.     <title>測試</title>  
  19. </head>  
  20. <body>  
  21.     <div >  
  22.         <canvas id='cas' width="800" height="600">瀏覽器不支持canvas</canvas>  
  23.         <div style="text-align:center">1000個圈圈對象也不卡</div>  
  24.     </div>  
  25.   
  26.     <script>  
  27.         var testBox = function(){   
  28.             var canvas = document.getElementById("cas"),   
  29.                 ctx = canvas.getContext('2d'),   
  30.                 borderWidth = 2,   
  31.                 Balls = [];   
  32.             var ball = function(x , y , vx , vy , useCache){   
  33.                 this.x = x;   
  34.                 this.y = y;   
  35.                 this.vx = vx;   
  36.                 this.vy = vy;   
  37.                 this.r = getZ(getRandom(20,40));   
  38.                 this.color = [];   
  39.                 this.cacheCanvas = document.createElement("canvas");   
  40.                 thisthis.cacheCtx = this.cacheCanvas.getContext("2d");   
  41.                 this.cacheCanvas.width = 2*this.r;   
  42.                 this.cacheCanvas.height = 2*this.r;   
  43.                 var num = getZ(this.r/borderWidth);   
  44.                 for(var j=0;j<num;j++){   
  45.                     this.color.push("rgba("+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+",1)");   
  46.                 }   
  47.                 this.useCache = useCache;   
  48.                 if(useCache){   
  49.                     this.cache();   
  50.                 }   
  51.             }   
  52.   
  53.             function getZ(num){   
  54.                 var rounded;   
  55.                 rounded = (0.5 + num) | 0;   
  56.                 // A double bitwise not.   
  57.                 rounded = ~~ (0.5 + num);   
  58.                 // Finally, a left bitwise shift.   
  59.                 rounded = (0.5 + num) << 0;   
  60.   
  61.                 return rounded;   
  62.             }   
  63.   
  64.             ball.prototype = {   
  65.                 paint:function(ctx){   
  66.                     if(!this.useCache){   
  67.                         ctx.save();   
  68.                         var j=0;   
  69.                         ctx.lineWidth = borderWidth;   
  70.                         for(var i=1;i<this.r;i+=borderWidth){   
  71.                             ctx.beginPath();   
  72.                             ctx.strokeStyle = this.color[j];   
  73.                             ctx.arc(this.x , this.y , i , 0 , 2*Math.PI);   
  74.                             ctx.stroke();   
  75.                             j++;   
  76.                         }   
  77.                         ctx.restore();   
  78.                     } else{   
  79.                         ctx.drawImage(this.cacheCanvas , this.x-this.r , this.y-this.r);   
  80.                     }   
  81.                 },   
  82.   
  83.                 cache:function(){   
  84.                     this.cacheCtx.save();   
  85.                     var j=0;   
  86.                     this.cacheCtx.lineWidth = borderWidth;   
  87.                     for(var i=1;i<this.r;i+=borderWidth){   
  88.                         this.cacheCtx.beginPath();   
  89.                         thisthis.cacheCtx.strokeStyle = this.color[j];   
  90.                         this.cacheCtx.arc(this.r , this.r , i , 0 , 2*Math.PI);   
  91.                         this.cacheCtx.stroke();   
  92.                         j++;   
  93.                     }   
  94.                     this.cacheCtx.restore();   
  95.                 },   
  96.   
  97.                 move:function(){   
  98.                     this.x += this.vx;   
  99.                     this.y += this.vy;   
  100.                     if(this.x>(canvas.width-this.r)||this.x<this.r){   
  101.                         thisthis.x=this.x<this.r?this.r:(canvas.width-this.r);   
  102.                         this.vx = -this.vx;   
  103.                     }   
  104.                     if(this.y>(canvas.height-this.r)||this.y<this.r){   
  105.                         thisthis.y=this.y<this.r?this.r:(canvas.height-this.r);   
  106.                         this.vy = -this.vy;   
  107.                     }   
  108.   
  109.                     this.paint(ctx);   
  110.                 }   
  111.             }   
  112.   
  113.             var Game = {   
  114.                 init:function(){   
  115.                     for(var i=0;i<1000;i++){   
  116.                         var b = new ball(getRandom(0,canvas.width) , getRandom(0,canvas.height) , getRandom(-10 , 10) ,  getRandom(-10 , 10) , true)   
  117.                         Balls.push(b);   
  118.                     }   
  119.                 },   
  120.   
  121.                 update:function(){   
  122.                     ctx.clearRect(0,0,canvas.width,canvas.height);   
  123.                     for(var i=0;i<Balls.length;i++){   
  124.                         Balls[i].move();   
  125.                     }   
  126.                 },   
  127.   
  128.                 loop:function(){   
  129.                     var _this = this;   
  130.                     this.update();   
  131.                     RAF(function(){   
  132.                         _this.loop();   
  133.                     })   
  134.                 },   
  135.   
  136.                 start:function(){   
  137.                     this.init();   
  138.                     this.loop();   
  139.                 }   
  140.             }   
  141.   
  142.             window.RAF = (function(){   
  143.                 return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {window.setTimeout(callback, 1000 / 60); };   
  144.             })();   
  145.   
  146.             return Game;   
  147.         }();   
  148.   
  149.         function getRandom(a , b){   
  150.             return Math.random()*(b-a)+a;   
  151.         }   
  152.   
  153.         window.onload = function(){   
  154.             testBox.start();   
  155.         }   
  156.     </script>  
  157. </body>  
  158. </html>  

  離屏canvas還有一個注意事項,如果你做的效果是會將對象不停地創建和銷毀,請慎重使用離屏canvas,至少不要像我上面寫的那樣給每個對象的屬性綁定離屏canvas。

  因為如果這樣綁定,當對象被銷毀時,離屏canvas也會被銷毀,而大量的離屏canvas不停地被創建和銷毀,會導致canvas buffer耗費大量GPU資源,容易造成瀏覽器崩潰或者嚴重卡幀現象。解決辦法就是弄一個離屏canvas數組,預先裝進足夠數量的離屏canvas,僅將仍然存活的對象緩存起來,當對象被銷毀時,再解除緩存。這樣就不會導致離屏canvas被銷毀了。

 

 【使用requestAnimationFrame】

  這個就不具體解釋了,估計很多人都知道,這個才是做動畫的最佳循環,而不是setTimeout或者setInterval。直接貼出兼容性寫法:

XML/HTML Code復制內容到剪貼板
  1. window.RAF = (function(){   
  2.        return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {window.setTimeout(callback, 1000 / 60); };   
  3.             })();   

  

  【避免浮點運算】

  雖然javascript提供了很方便的一些取整方法,像Math.floor,Math.ceil,parseInt,但是,國外友人做過測試,parseInt這個方法做了一些額外的工作(比如檢測數據是不是有效的數值,parseInt 甚至先將參數轉換成了字符串!),所以,直接用parseInt的話相對來說比較消耗性能,那怎樣取整呢,可以直接用老外寫的很巧妙的方法了:

    JavaScript Code復制內容到剪貼板

    1.rounded = (0.5 + somenum) | 0;      

    2.rounded = ~~ (0.5 + somenum);   3.rounded = (0.5 + somenum) << 0;      

    運算符不懂的可以直接戳:http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp  里面有詳細解釋

  

  【盡量減少canvasAPI的調用】

  作粒子效果時,盡量少使用圓,最好使用方形,因為粒子太小,所以方形看上去也跟圓差不多。至于原因,很容易理解,我們畫一個圓需要三個步驟:先beginPath,然后用arc畫弧,再用fill進行填充才能產生一個圓。但是畫方形,只需要一個fillRect就可以了。雖然只是差了兩個調用,當粒子對象數量達到一定時,這性能差距就會顯示出來了。

  還有一些其他注意事項,我就不一一列舉了,因為谷歌上一搜也挺多的。我這也算是一個給自己做下記錄,主要是記錄緩存的用法。想要提升canvas的性能最主要的還是得注意代碼的結構,減少不必要的API調用,在每一幀中減少復雜的運算或者把復雜運算由每一幀算一次改成數幀算一次。同時,上面所述的緩存用法,我因為貪圖方便,所以是每個對象一個離屏canvas,其實離屏canvas也不能用的太泛濫,如果用太多離屏canvas也會有性能問題,請盡量合理利用離屏canvas。

   源碼地址:https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Other-demo/cache

標簽:蚌埠 鶴崗 內蒙古 辛集 楊凌 撫順 黃山 德州

巨人網絡通訊聲明:本文標題《淺談利用緩存來優化HTML5 Canvas程序的性能》,本文關鍵詞  淺談,利用,緩存,來,優化,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談利用緩存來優化HTML5 Canvas程序的性能》相關的同類信息!
  • 本頁收集關于淺談利用緩存來優化HTML5 Canvas程序的性能的相關信息資訊供網民參考!
  • 推薦文章
    日韩写真欧美这视频| 久久天天狠狠| 国产一区二区视频在线播放| www.亚洲成人| 久久精品五月| 国产xxx69麻豆国语对白| 男人网站在线观看| 亚洲国产视频在线| 亚洲一区二区图片| 色噜噜在线播放| 午夜精品久久久久久久99热浪潮| 无码国产精品一区二区免费16| 国产成人亚洲综合91精品| 成人av手机在线| 国产精华一区| 伊人手机在线视频| 国产成人精品一区二区三区福利| 亚洲第一视频在线| 日本 片 成人 在线| 亚洲福利视频专区| 秋霞精品一区二区三区| 国产精品91视频| 日本成人在线免费| 久久精品福利视频| 高清不卡一二三区| 九九热这里有精品视频| 北条麻妃视频在线| 久久精品国产欧美亚洲人人爽| 国产一区二区三区久久久| 精品少妇无遮挡毛片| 色综合天天性综合| 欧美性猛交xx| 久久久久久这里只有精品| 国产精品国产亚洲精品看不卡| 国产亚洲精品福利| 中文字幕一二区| 91超碰在线电影| 欧美韩国日本综合| 国内精品免费视频| 亚洲啪啪综合av一区二区三区| 极品人妻videosss人妻| 国产精品亚洲综合| 欧美激情videos| 亚洲国产欧美自拍| 亚洲精品免费视频| www.国产精品视频| xxxxxx在线观看| 亚洲精品成人悠悠色影视| 欧美老女人性生活视频| 成人久久18免费网站图片| 久久97人妻无码一区二区三区| 亚洲精品国产电影| 一区二区三区四区不卡视频 | 99久久国产精| 亚洲v中文字幕| 国产一区第一页| 国产精品视频在线免费观看| 91高清视频免费| 久久躁狠狠躁夜夜爽| 亚洲国内高清视频| 亚洲高清视频在线| 卡一卡二国产精品| 国产毛片毛片毛片毛片毛片毛片| 精品处破学生在线二十三| av观看在线免费| 在线观看国产福利| 色狠狠av一区二区三区| 欧美巨胸大乳hitomi| 日本人体一区二区| 久久久久久九九| 日韩欧美一区二区视频| 黄页网站大全一区二区| 91美女片黄在线观| 欧美午夜寂寞影院| 午夜视频在线播放| 亚洲系列第一页| 久久久久久久蜜桃| 一区二区三区少妇| 性色av浪潮av| 国产在线拍揄自揄视频不卡99 | 亚洲成人动漫在线播放| 人人狠狠综合久久亚洲| 四虎免费在线视频| 国产精品大陆在线观看| 91视频在线看| 国产精品久久影视| 国产精品高清无码在线观看| 成人av电影免费| 搡老女人一区二区三区视频tv| 亚洲一级二级片| 中文字幕一区二区三区人妻在线视频| 潘金莲一级淫片aaaaa免费看| 五月天色婷婷综合| 亚洲一区免费看| 日本人妻伦在线中文字幕| 久久免费一级片| www.久久艹| 国产一区二区久久精品| 国产成人午夜精品影院观看视频 | 97在线观看免费视频| 久99九色视频在线观看| 综合久久久久久久| 久久综合久久鬼色| 国产av精国产传媒| 日韩在线观看视频一区二区| 好吊日免费视频| 亚洲国产成人av在线| 欧美最新大片在线看| 国产精品久久久久久久第一福利| 亚洲欧美日韩国产中文在线| 91搞黄在线观看| 亚洲激情国产精品| 中文字幕一区二区精品| www.欧美三级电影.com| 91精品国产欧美一区二区| 午夜精品久久久久久久爽| 国产第一页精品| 日本中文字幕在线视频观看| 2019国产精品视频| 亚洲国产va精品久久久不卡综合| 亚洲第一视频在线| 激情综合色播五月| 99精品国产视频| 国产精品久久777777换脸| 少妇性l交大片7724com| 国产三区在线视频| 亚洲精品久久久久国产| 日本中文在线一区| 亚洲国产精品视频在线| 国产成人激情av| 亚洲一卡二卡三卡四卡| 91精品国产综合久久精品麻豆| 日韩精品视频在线播放| 亚洲视频自拍偷拍| 欧美性猛片aaaaaaa做受| 国产福利电影一区二区三区| 亚洲产国偷v产偷v自拍涩爱| 无码人妻精品一区二| 欧美肥妇bbwbbw| 欧美日韩亚洲综合一区二区三区激情在线| 欧美成人精品在线播放| 欧美一区二区综合| 91wwwcom在线观看| 成人国产在线激情| 欧美午夜片在线免费观看| 青青操视频在线播放| 国产尤物在线播放| 九九热视频精品| 首页欧美精品中文字幕| 香蕉成人伊视频在线观看| 日韩av中文字幕在线| 性色av一区二区三区| 日韩久久在线| 日本欧洲国产一区二区| 欧美一区少妇| 97视频热人人精品| 国产精品久久久久不卡| 人人爽久久涩噜噜噜网站| 亚洲国产欧美一区二区丝袜黑人| www日韩大片| 久久激情五月婷婷| 午夜精品视频一区| 亚洲精品www久久久久久广东| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲一区高清| 日本a级片久久久| 国产 日韩 亚洲 欧美| 日本猛少妇色xxxxx免费网站| 久色婷婷小香蕉久久| 91精品福利在线一区二区三区 | 人妻少妇精品无码专区二区| 热久久精品免费视频| 18黄暴禁片在线观看| 综合操久久久| 一本久道综合色婷婷五月| 成人在线免费高清视频| 成人欧美在线观看| 午夜精品蜜臀一区二区三区免费| 日本视频一区二区在线观看| 日本888xxxx| 久久久久免费精品| 97精品人妻一区二区三区蜜桃| 国产香蕉在线视频| 91视频 -- 69xx| 亚洲综合图片一区| 国产又粗又猛又爽| 欧美色视频日本高清在线观看| 国产精品久久久久影院日本| 国产精品www爽爽爽| 极品少妇一区二区三区精品视频| 欧美va亚洲va| 久久久一本精品99久久精品66 | 成年人视频网站免费观看| 91欧美视频在线| 真实乱视频国产免费观看| 1024手机在线视频| 色欲狠狠躁天天躁无码中文字幕| 麻豆天美蜜桃91| 亚洲男女视频在线观看| 一本色道综合亚洲| 日韩av影视在线| 日韩免费观看在线观看| 极品日韩久久| 亚洲熟妇无码av| 国产精品第12页| 中文字幕无码人妻少妇免费| 国产区精品在线| 91原创在线视频| 久久久欧美精品| 国产一级免费大片| 国产一区视频导航| 在线看日韩欧美| 免费观看精品视频| 日韩黄色a级片| 久久久国产午夜精品| 亚洲高清免费在线| 日日噜噜噜夜夜爽亚洲精品| 亚洲在线免费看| 男人的天堂日韩| 日韩av一二三四| 久久人人爽人人爽人人片| 中文字幕福利视频| 日本福利一区二区| 国产一区欧美二区三区| 99久久国产宗和精品1上映| 久热这里有精品| 久久综合久色欧美综合狠狠| 日本高清视频免费看| 亚洲精品自拍动漫在线| 午夜剧场成人观在线视频免费观看| 国产v亚洲v天堂无码久久久| 亚洲高清视频网站| 欧美日产在线观看| 99国内精品久久久久久久软件| 成人在线看视频| 久久久久亚洲av片无码| 成人激情校园春色| 国产亚洲一区精品| av成人免费观看| 先锋影音亚洲资源| 少妇视频在线播放| 亚洲电影一区二区三区| 免费看污久久久| 永久av免费在线观看| av在线免费在线观看| 欧美va亚洲va国产综合| 久久影视电视剧免费网站| 在线观看视频黄色| 六月丁香在线视频| 欧美日精品一区视频| 亚洲影影院av| 黄色录像免费观看| eeuss国产一区二区三区| 91精品国产综合久久精品性色| 97在线精品视频| 欧美成人xxxxx| 国产成人精品一区二三区四区五区| 国产人成亚洲第一网站在线播放| 在线免费不卡视频| 久久亚洲国产精品日日av夜夜| 国产精品99re| 欧美影院精品一区| 国产精品国产三级国产专播精品人 | 日韩av中文在线观看| 欧美日本在线一区| 国产精品入口芒果| 国产精品免费人成网站| 亚洲在线观看网站| 8x8x8国产精品| 黄色性生活一级片| 制服丝袜成人动漫| 桥本有菜av在线| 国产福利小视频| 日韩电影中文 亚洲精品乱码 | 亚洲天堂一二三| 日韩欧美高清dvd碟片| 青青在线免费观看视频| av首页在线观看| 国产精品毛片高清在线完整版 | 中文字幕在线看视频国产欧美在线看完整 | www.5588.com毛片| 蜜臀国产一区二区三区在线播放| 国模视频一区二区| 日本一级特级毛片视频| 亚洲精品99999| 少妇一级淫片免费放中国| 国产日韩欧美视频在线| 极品少妇xxxx精品少妇偷拍 | 在线成人免费网站| 国产老熟女伦老熟妇露脸| 亚洲乱码中文字幕综合| 91在线高清视频| 亚洲一区二区人妻| 俺也去精品视频在线观看| 91porn在线| 欧美日韩午夜影院| 欧美乱偷一区二区三区在线| 夜夜春很很躁夜夜躁| 91香蕉国产在线观看软件| 久久久久久一区二区三区 | 亚洲精品国产久| 最新中文字幕一区二区三区| 欧美深夜福利视频| 日韩激情视频网站| 成人深夜直播免费观看| 亚洲视频一区在线播放| 国产欧美va欧美va香蕉在| 久久精品人人做人人综合| 免费在线观看日韩av| 久久久久久国产精品| 日精品一区二区| 亚洲欧美日韩不卡| 亚洲成人精品一区| 无码人妻精品一区二区三应用大全| 欧美亚洲综合色| 热久久精品免费视频| 99热这里都是精品| αv一区二区三区| 久久精品人人做人人爽电影蜜月| 久久精品人成| 久久av资源站| 久久男人av资源网站| 我想看黄色大片| 亚洲男同1069视频| 欧美国产综合视频| 奇米综合一区二区三区精品视频| 久久久久久久久久久久久久久久久久av| 国产精品7777777| 久久福利视频导航| 国产成人精品一区二区无码呦| 久久久国产91| 人妻视频一区二区三区| 国产精品专区h在线观看| 久久国产综合精品| 免费的av网站| 国产欧美va欧美va香蕉在| 夜夜嗨av一区二区三区| 久久国产波多野结衣| 国产精品美女主播在线观看纯欲| 久久99精品久久久| 日韩精品一区二区三区四区五区| 91亚洲午夜精品久久久久久| 永久久久久久| 国产99免费视频| 欧美大胆a视频| 蜜桃av噜噜一区二区三区麻豆| 免费成人深夜夜行网站视频| 国产三级精品三级在线专区| 免费h精品视频在线播放| 麻豆精品视频在线观看视频| 久久精精品视频| 成人在线综合网站| 2025韩国大尺度电影| 99久久精品国产麻豆演员表| 天堂视频免费看| 日韩欧美自拍偷拍| 羞羞色院91蜜桃| 国产成人激情小视频| 成人精品在线视频观看| 91免费视频网站在线观看| 精品精品国产高清a毛片牛牛 | 黄色片视频在线播放| 欧美日本在线看| 糖心vlog免费在线观看| 久久免费高清视频| 99久久伊人久久99| 污网站在线免费| 欧美丰满少妇xxxxx| 国产一区二区在线观看视频| 日韩成人三级视频| 色视频成人在线观看免| 殴美一级黄色片| 亚洲一区二区三区香蕉| 欧美精品一区二区在线观看| 91美女片黄在线| 亚洲成a人无码| 45www国产精品网站| 91碰在线视频| 日本女人性生活视频| 国产精品黄视频| 亚洲欧美日韩成人在线| 亚洲午夜高清视频| 精品国产乱码久久久久久久久| 日本视频在线一区| www.88av| 91精品久久久久久蜜桃| 亚洲精品国产精品国自产观看浪潮 | 日韩激情视频在线观看| 日本福利视频网站| 亚洲女人被黑人巨大进入| 岛国一区二区三区| 免费黄色在线视频| 欧美性大战久久久久| 欧美性xxxxxxx| 美女的奶胸大爽爽大片| 高清视频在线观看一区| 午夜激情一区二区| 亚洲精品国产欧美在线观看| www.xxx亚洲| 久久99国产精品99久久| 日韩在线观看免费全集电视剧网站| 亚洲欧美强伦一区二区| 国产亚洲色婷婷久久| 91视频免费在线| 亚洲人成网在线播放| 国产女主播一区| 99久久精品免费视频| 国产成人久久久精品一区| 日韩视频一区二区在线观看| 成人动漫一区二区|