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

WebAssembly 初體驗:從零開始重構計算模塊

開發 開發工具
WebAssembly 的概念、意義以及未來帶來的性能提升相信已是耳熟能詳,筆者在前端每周清單系列中也是經常會推薦 WebAssembly 相關文章。不過筆者也只是了解其概念而未真正付諸實踐,本文即是筆者在將我司某個簡單項目中的計算模塊重構為 WebAssembly 過程中的總結。

[[194126]]

WebAssembly 的概念、意義以及未來帶來的性能提升相信已是耳熟能詳,筆者在前端每周清單系列中也是經常會推薦 WebAssembly 相關文章。不過筆者也只是了解其概念而未真正付諸實踐,本文即是筆者在將我司某個簡單項目中的計算模塊重構為 WebAssembly 過程中的總結。在簡單的實踐中筆者個人感覺,WebAssembly 的抽象程度會比 JavaScript 高不少,未來對于大型項目的遷移,對于純前端工程師而言可能存在的坑也是不少,仿佛又回到了被指針統治的年代。本文筆者使用的案例已經集成到了 React 腳手架 create-react-boilerplate 中 ,可以方便大家快速本地實踐。

編譯環境搭建

我們使用 Emscripten 將 C 代碼編譯為 wasm 格式,官方推薦的方式是首先下載 Portable Emscripten SDK for Linux and OS X (emsdk-portable.tar.gz) 然后利用 emsdk 進行安裝:

  1. $ ./emsdk update 
  2. $ ./emsdk install latest 
  3. # 如果出現異常使用 ./emsdk install sdk-1.37.12-64bit 
  4. # https://github.com/kripken/emscripten/issues/5272 

安裝完畢后激活響應環境即可以進行編譯:

  1. $ ./emsdk activate latest  
  2. $ source ./emsdk_env.sh # you can add this line to your .bashrc 

筆者在本地執行上述搭建步驟時一直失敗,因此改用了 Docker 預先配置好的鏡像進行處理:

  1. # 拉取 Docker 鏡像 
  2. docker pull 42ua/emsdk 
  3.  
  4. # 執行編譯操作 
  5. docker run --rm -v $(pwd):/home/src 42ua/emsdk emcc hello_world.c 

對應的 Dockfile 如下所示,我們可以自行修改以適應未來的編譯環境:

  1. FROM ubuntu 
  2.  
  3. RUN \ 
  4.     apt-get update && apt-get install -y build-essential \ 
  5.     cmake python2.7 python nodejs-legacy default-jre git-core curl && \ 
  6.     apt-get clean && \ 
  7.     cd ~/ && \ 
  8.     curl -sL https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz | tar xz && \ 
  9.     cd emsdk-portable/ && \ 
  10.     ./emsdk update && \ 
  11.     ./emsdk install -j1 latest && \ 
  12.     ./emsdk activate latest && \ 
  13.     rm -rf ~/emsdk-portable/clang/tag-*/src && \ 
  14.     find . -name "*.o" -exec rm {} \; && \ 
  15.     find . -name "*.a" -exec rm {} \; && \ 
  16.     find . -name "*.tmp" -exec rm {} \; && \ 
  17.     find . -type d -name ".git" -prune -exec rm -rf {} \; && \ 
  18.     apt-get -y --purge remove curl git-core cmake && \ 
  19.     apt-get -y autoremove && apt-get clean 
  20.  
  21. # http://docs.docker.com/engine/reference/run/#workdir 
  22. WORKDIR /home/src 

到這里基本環境已經配置完畢,我們可以對簡單的 counter.c 進行編譯,源文件如下:

  1. int counter = 100; 
  2.  
  3. int count() {   
  4.     counter += 1; 
  5.     return counter; 

編譯命令如下所示,如果本地安裝好了 emcc 則可以直接使用,否則使用 Docker 環境進行編譯:

  1. $ docker run --rm -v $(pwd):/home/src 42ua/emsdk emcc counter.c -s WASM=1 -s SIDE_MODULE=1 -o counter.wasm 
  2. $ emcc counter.c -s WASM=1 -s SIDE_MODULE=1 -o counter.wasm 
  3.  
  4. # 如果出現以下錯誤,則是由如下參數 
  5. # WebAssembly Link Error: import object field 'DYNAMICTOP_PTR' is not a Number 
  6. emcc counter.c -O1 -s WASM=1 -s SIDE_MODULE=1 -o counter.wasm  

這樣我們就得到了 WebAssembly 代碼:

與 JavaScript 集成使用

獨立的 .wasm 文件并不能直接使用,我們需要在客戶端中使用 JavaScript 代碼將其加載進來。最樸素的加載 WebAssembly 的方式就是使用 fetch 抓取然后編譯,整個過程可以封裝為如下函數:

  1. // 判斷是否支持 WebAssembly 
  2.     if (!('WebAssembly' in window)) { 
  3.       alert('當前瀏覽器不支持 WebAssembly!'); 
  4.     } 
  5.     // Loads a WebAssembly dynamic library, returns a promise. 
  6.     // imports is an optional imports object 
  7.     function loadWebAssembly(filename, imports) { 
  8.       // Fetch the file and compile it 
  9.       return fetch(filename) 
  10.         .then(response => response.arrayBuffer()) 
  11.         .then(buffer => WebAssembly.compile(buffer)) 
  12.         .then(module => { 
  13.           // Create the imports for the module, including the 
  14.           // standard dynamic library imports 
  15.           imports = imports || {}; 
  16.           imports.env = imports.env || {}; 
  17.           imports.env.memoryBase = imports.env.memoryBase || 0; 
  18.           imports.env.tableBase = imports.env.tableBase || 0; 
  19.           if (!imports.env.memory) { 
  20.             imports.env.memory = new WebAssembly.Memory({ initial: 256 }); 
  21.           } 
  22.           if (!imports.env.table) { 
  23.             imports.env.table = new WebAssembly.Table({ initial: 0, element: 'anyfunc' }); 
  24.           } 
  25.           // Create the instance. 
  26.           return new WebAssembly.Instance(module, imports); 
  27.         }); 
  28.     } 

我們可以使用上述工具函數加載 wasm 文件:

  1. loadWebAssembly('counter.wasm'
  2.      .then(instance => { 
  3.        var exports = instance.exports; // the exports of that instance 
  4.        var count = exports. _count; // the "_count" function (note "_" prefix) 
  5.        // 下面即可以調用 count 函數 
  6.      } 
  7.    ); 

而在筆者的腳手架中,使用了 wasm-loader 進行加載,這樣可以將 wasm 直接打包在 Bundle 中,然后通過 import 導入:

  1. import React, { PureComponent } from "react"
  2.  
  3. import CounterWASM from "./counter.wasm"
  4. import Button from "antd/es/button/button"
  5.  
  6. import "./Counter.scss"
  7.  
  8. /** 
  9.  * Description 簡單計數器示例 
  10.  */ 
  11. export default class Counter extends PureComponent { 
  12.   state = { 
  13.     count: 0 
  14.   }; 
  15.  
  16.   componentDidMount() { 
  17.     this.counter = new CounterWASM({ 
  18.       env: { 
  19.         memoryBase: 0, 
  20.         tableBase: 0, 
  21.         memory: new window.WebAssembly.Memory({ initial: 256 }), 
  22.         table: new window.WebAssembly.Table({ initial: 0, element: "anyfunc" }) 
  23.       } 
  24.     }); 
  25.     this.setState({ 
  26.       count: this.counter.exports._count() 
  27.     }); 
  28.   } 
  29.  
  30.   /** 
  31.    * Description 默認渲染函數 
  32.    */ 
  33.   render() { 
  34.     const isWASMSupport = "WebAssembly" in window; 
  35.  
  36.     if (!isWASMSupport) { 
  37.       return ( 
  38.         <div> 
  39.           瀏覽器不支持 WASM 
  40.         </div> 
  41.       ); 
  42.     } 
  43.  
  44.     return ( 
  45.       <div className="Counter__container"
  46.         <span> 
  47.           簡單計數器示例: 
  48.         </span> 
  49.         <span>{this.state.count}</span> 
  50.         <Button 
  51.           type="primary" 
  52.           onClick={() => { 
  53.             this.setState({ 
  54.               count: this.counter.exports._count() 
  55.             }); 
  56.           }} 
  57.         > 
  58.           點擊自增 
  59.         </Button> 
  60.       </div> 
  61.     ); 
  62.   } 

在使用 wasm-loader 時,其會調用 new WebAssembly.Instance(module, importObject);

module 即 WebAssembly.Module 實例。

importObject 即默認的由 wasm-loader 提供的對象。

簡單游戲引擎重構

上文我們討論了利用 WebAssembly 重構簡單的計數器模塊,這里我們以簡單的游戲為例,交互式的感受 WebAssembly 帶來的性能提升,可以直接查看游戲的在線演示。這里的游戲引擎即是執行部分計算與重新賦值操作,譬如這里的計算下一個位置狀態的函數在 C 中實現為:

  1. EMSCRIPTEN_KEEPALIVE 
  2. void computeNextState() 
  3.   loopCurrentState(); 
  4.  
  5.   int neighbors = 0; 
  6.   int i_m1, i_p1, i_; 
  7.   int j_m1, j_p1; 
  8.   int height_limit = height - 1; 
  9.   int width_limit = width - 1; 
  10.   for (int i = 1; i < height_limit; i++) 
  11.   { 
  12.     i_m1 = (i - 1) * width; 
  13.     i_p1 = (i + 1) * width; 
  14.     i_ = i * width; 
  15.     for (int j = 1; j < width_limit; j++) 
  16.     { 
  17.       j_m1 = j - 1; 
  18.       j_p1 = j + 1; 
  19.       neighbors = current[i_m1 + j_m1]; 
  20.       neighbors += current[i_m1 + j]; 
  21.       neighbors += current[i_m1 + j_p1]; 
  22.       neighbors += current[i_ + j_m1]; 
  23.       neighbors += current[i_ + j_p1]; 
  24.       neighbors += current[i_p1 + j_m1]; 
  25.       neighbors += current[i_p1 + j]; 
  26.       neighbors += current[i_p1 + j_p1]; 
  27.       if (neighbors == 3) 
  28.       { 
  29.         next[i_ + j] = 1; 
  30.       } 
  31.       else if (neighbors == 2) 
  32.       { 
  33.         next[i_ + j] = current[i_ + j]; 
  34.       } 
  35.       else 
  36.       { 
  37.         next[i_ + j] = 0; 
  38.       } 
  39.     } 
  40.   } 
  41.   memcpy(currentnext, width * height); 

而對應的 JS 版本引擎的實現為:

  1. computeNextState() { 
  2.   let neighbors, iM1, iP1, i_, jM1, jP1; 
  3.  
  4.   this.loopCurrentState(); 
  5.  
  6.   for (let i = 1; i < this._height - 1; i++) { 
  7.     iM1 = (i - 1) * this._width; 
  8.     iP1 = (i + 1) * this._width; 
  9.     i_ = i * this._width; 
  10.     for (let j = 1; j < this._width - 1; j++) { 
  11.       jM1 = j - 1; 
  12.       jP1 = j + 1; 
  13.       neighbors = this._current[iM1 + jM1]; 
  14.       neighbors += this._current[iM1 + j]; 
  15.       neighbors += this._current[iM1 + jP1]; 
  16.       neighbors += this._current[i_ + jM1]; 
  17.       neighbors += this._current[i_ + jP1]; 
  18.       neighbors += this._current[iP1 + jM1]; 
  19.       neighbors += this._current[iP1 + j]; 
  20.       neighbors += this._current[iP1 + jP1]; 
  21.       if (neighbors === 3) { 
  22.         this._next[i_ + j] = 1; 
  23.       } else if (neighbors === 2) { 
  24.         this._next[i_ + j] = this._current[i_ + j]; 
  25.       } else { 
  26.         this._next[i_ + j] = 0; 
  27.       } 
  28.     } 
  29.   } 
  30.   this._current.set(this._next); 

本部分的編譯依舊是直接將 [engine.c]() 編譯為 engine.wasm,不過在導入的時候我們需要動態地向 wasm 中注入外部函數:

  1. this.module = new EngineWASM({ 
  2.       env: { 
  3.         memoryBase: 0, 
  4.         tableBase: 0, 
  5.         memory: new window.WebAssembly.Memory({ initial: 1024 }), 
  6.         table: new window.WebAssembly.Table({ initial: 0, element: "anyfunc" }), 
  7.         _malloc: size => { 
  8.           let buffer = new ArrayBuffer(size); 
  9.           return new Uint8Array(buffer); 
  10.         }, 
  11.         _memcpy: (source, target, size) => { 
  12.           let sourceEnd = source.byteLength; 
  13.  
  14.           let i, j; 
  15.  
  16.           for ( 
  17.             (i = 0), (j = 0), (k = new Uint8Array(target)), (l = new Uint8Array( 
  18.               source 
  19.             )); 
  20.             i < sourceEnd; 
  21.             ++i, ++j 
  22.           ) 
  23.             k[j] = l[i]; 
  24.         } 
  25.       } 
  26.     }); 

到這里文本告一段落,筆者***需要聲明的是因為這只是隨手做的實驗,***的代碼包括對于內存的操作可能存在潛在問題,請讀者批評指正。

【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2018-09-14 17:16:22

云計算軟件計算機網絡

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機

2022-04-01 08:09:03

操作系統嵌入式重構

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構

2010-05-26 17:35:08

配置Xcode SVN

2024-05-15 14:29:45

2023-11-16 08:53:05

NumPy庫Python

2015-10-15 14:16:24

2024-04-10 07:48:41

搜索引擎場景

2011-04-06 15:55:50

開發webOS程序webOS

2024-11-28 10:35:47

2020-02-11 16:49:24

React前端代碼

2019-09-23 19:30:27

reduxreact.js前端

2024-03-01 19:53:37

PyBuilderPython開發

2023-03-21 07:35:43

2014-07-22 13:09:21

android

2011-09-05 14:17:54

Sencha ToucMVC
點贊
收藏

51CTO技術棧公眾號

在线手机中文字幕| 丰满人妻一区二区三区免费| 日韩精品免费一区二区在线观看| 在线播放91灌醉迷j高跟美女| 成人毛片100部免费看| 四虎影视在线播放| 久久国产精品99久久久久久老狼| 欧美精品久久一区二区| 亚洲精品视频久久久| 精品国产不卡一区二区| 一本高清dvd不卡在线观看| 在线不卡日本| 你懂得在线网址| 国产精品一区免费在线观看| 国产精品成av人在线视午夜片| 欧美日韩在线观看免费| 精品视频99| 日韩成人免费视频| 成人三级做爰av| 99久久精品一区二区成人| 午夜欧美2019年伦理| 一本一道久久a久久精品综合 | 精品国产一区二区三区麻豆免费观看完整版 | 毛片网站在线看| 国产精品热久久久久夜色精品三区 | 国产精品一区二区av白丝下载| 男女av一区三区二区色多| 欧美国产视频日韩| 日本妇女毛茸茸| 五月开心六月丁香综合色啪| 国产亚洲视频在线观看| 9.1成人看片免费版| 国内自拍欧美| 精品粉嫩aⅴ一区二区三区四区| 欧美性受xxxx黒人xyx性爽| 91国拍精品国产粉嫩亚洲一区| 欧美日韩中国免费专区在线看| 日韩精品免费一区| 国产精品久久久久久福利| 国产欧美一区二区精品忘忧草| 久久精品午夜一区二区福利| 亚洲黄色精品视频| 国产一区二区视频在线| 成人国产精品久久久| 国产情侣呻吟对白高潮| 日韩二区在线观看| 国产精品欧美一区二区三区奶水| 日韩熟女一区二区| 日韩精品色哟哟| 日韩美女中文字幕| www.久久精品视频| 日韩电影免费一区| 国产精品亚洲综合天堂夜夜| 波多野结衣电车| 青青草伊人久久| 国产精品视频一区国模私拍| 中文字幕av网站| 另类的小说在线视频另类成人小视频在线| 国产精品久久综合av爱欲tv| 欧美性猛交xxxx乱大交hd| 日韩中文字幕91| 国产精品久久久久久亚洲调教| 亚洲精品国产无码| 久久91精品久久久久久秒播| 91精品中文在线| 亚洲免费成人网| 99综合电影在线视频| 欧美久久在线| 日韩免费网站| 一区二区三区在线观看国产| 成人性生活视频免费看| 亚洲校园激情春色| 欧美日韩国产天堂| 青青草原播放器| 国产精品巨作av| 国产手机视频精品| 影音先锋男人资源在线观看| 欧美黄免费看| 97色伦亚洲国产| 中文字幕永久在线| 国产一区二三区好的| 国产视频精品网| 成年人视频在线免费观看| 亚洲免费在线视频| 日本www在线播放| 国产精品蜜月aⅴ在线| 欧美一区二区不卡视频| 亚洲熟女乱综合一区二区三区| 免费久久精品| 欧美成人免费网| 成年人av网站| 精品一二三四在线| 精品一区久久久| 成人亚洲性情网站www在线观看| 亚洲精品videosex极品| 妞干网在线免费视频| 精品一区二区三区四区五区| 亚洲欧美日韩天堂| 青青青在线免费观看| 欧美亚洲一区| 亚洲影视九九影院在线观看| 欧洲免费在线视频| 一区2区3区在线看| 最新天堂中文在线| 私拍精品福利视频在线一区| 久久久www成人免费精品张筱雨| 在线观看 中文字幕| 国产资源精品在线观看| 麻豆一区区三区四区产品精品蜜桃| 日本中文在线观看| 日韩欧美a级成人黄色| 涩涩网站在线看| 国产成人av| 97香蕉久久超级碰碰高清版| jizz国产视频| 中文字幕一区在线| 91看片就是不一样| 久久久久久毛片免费看| 久久97精品久久久久久久不卡| 国产成人精品一区二区色戒| 99re亚洲国产精品| 久草免费福利在线| 91精品网站在线观看| 中文字幕亚洲欧美日韩高清 | 欧美综合亚洲图片综合区| caopor在线| 欧美激情1区| 国产综合久久久久久| 国内精品在线视频| 狠狠色狠狠色综合日日小说| 丝袜熟女一区二区三区| 欧美91大片| 91色中文字幕| 日本不卡视频| 91麻豆精品国产91久久久久久久久| 欧美图片第一页| 亚洲欧美日韩一区在线观看| 精品国产综合| 九色porny丨国产首页在线| 精品国产精品网麻豆系列| 成人观看免费视频| 国产福利精品导航| 国产欧美123| 91国内精品| 久久久久久久久亚洲| 高清国产mv在线观看| 一区二区三区成人| 丰满熟女人妻一区二区三区| 极品少妇一区二区三区| 国产精品裸体一区二区三区| 超碰在线cao| 日韩电视剧在线观看免费网站| 日本特黄一级片| 久久亚洲一级片| 无码人妻丰满熟妇区毛片| 精品国产一级毛片| 国产一区二区在线播放| 黄网站免费在线播放| 日韩欧美电影一二三| 久久精品美女视频| 91在线免费播放| 99草草国产熟女视频在线| 青青草成人影院| 亚洲一区亚洲二区| 999av小视频在线| 精品视频在线播放色网色视频| 性色av免费观看| 中文字幕在线不卡一区二区三区| 波多野结衣网页| 一区在线免费| 日韩精品不卡| 欧美h版在线观看| 久久久久久尹人网香蕉| 奇米影视888狠狠狠777不卡| 欧美日本国产一区| 日韩精品视频免费看| 久久久亚洲午夜电影| 国产三级国产精品国产专区50| 亚洲人体av| 久草一区二区| 男人亚洲天堂| 亚州国产精品久久久| avav免费在线观看| 精品国产精品一区二区夜夜嗨| 波多野结衣一区二区在线| 女一区二区三区| 九九久久久久久久久激情| 天天干天天爽天天操| 欧美吞精做爰啪啪高潮| 欧美日韩成人免费观看| 久久久精品tv| 国产伦理在线观看| 欧美a一区二区| 欧妇女乱妇女乱视频| 蜜桃国内精品久久久久软件9| 91香蕉国产在线观看| 在线高清av| 欧美另类精品xxxx孕妇| 国产女人在线观看| 亚洲精品在线三区| 国产又色又爽又黄又免费| 午夜久久久影院| 久草视频手机在线| 国产亚洲人成网站| 四虎精品一区二区| 国产自产视频一区二区三区| 精品久久久噜噜噜噜久久图片 | 大奶在线精品| 国产精品主播视频| 台湾佬中文娱乐网欧美电影| 欧美人交a欧美精品| yjizz视频网站在线播放| 日韩av综合网| 开心激情综合网| 欧美一区二区三区影视| 九九热最新视频| 午夜精品久久久久久不卡8050| 天天操天天操天天操天天操天天操| 久久久久国色av免费看影院| 呦呦视频在线观看| 粉嫩av亚洲一区二区图片| 99日在线视频| 麻豆成人av在线| 欧美一级片中文字幕| 悠悠资源网久久精品| 欧美一区二区三区综合| 性欧美欧美巨大69| 在线观看成人av| 欧美色图激情小说| 日本一区免费看| 色综合久久中文| 国产精品一码二码三码在线| 日韩精品一区二区三区中文字幕 | 国产白浆在线观看| 欧美三级中文字| 最好看的日本字幕mv视频大全| 91高清视频免费看| 一级黄色在线视频| 色激情天天射综合网| 中文字幕高清在线免费播放| 狠狠色狠色综合曰曰| 韩国av中文字幕| 色综合天天在线| 日韩黄色一级视频| 欧美亚洲动漫精品| 中文字幕视频二区| 欧美日韩国产欧美日美国产精品| 中文字幕+乱码+中文| 欧美人妖巨大在线| 国产精品日韩无码| 日韩三级精品电影久久久| 国产黄a三级三级三级| 精品国产青草久久久久福利| 色偷偷在线观看| 日韩成人xxxx| 成年人在线看| 久久久精品免费| 国产又色又爽又黄刺激在线视频| 久久久久久久影院| 一区二区乱码| 国产欧美一区二区| 99精品女人在线观看免费视频| 91精品国产91久久久久青草| 99a精品视频在线观看| 久久久久久久久久久一区| 精品一区二区三| 最近看过的日韩成人| 欧美视频官网| 欧洲av无码放荡人妇网站| 日韩avvvv在线播放| 亚洲一二区在线观看| 成人精品鲁一区一区二区| 在线 丝袜 欧美 日韩 制服| 中文字幕欧美区| 免费麻豆国产一区二区三区四区| 精品女厕一区二区三区| 这里只有精品国产| 日韩免费高清av| 日本一卡二卡四卡精品| 日韩亚洲国产中文字幕| 午夜激情在线| 国产成人精品优优av| 99精品在线免费观看| 久久精品日产第一区二区三区精品版 | 亚洲天堂电影网| 国产综合亚洲精品一区二| 成年人免费在线播放| 狠狠色丁香婷婷综合| 亚洲黄色免费在线观看| 国产精品久久久久一区二区三区共| 久久久国产精华液| 91官网在线免费观看| 亚洲精品久久久久久动漫器材一区| 亚洲精品日韩欧美| 八戒八戒神马在线电影| 青草青草久热精品视频在线观看| gogo大尺度成人免费视频| 欧美大陆一区二区| 欧美大片专区| 男人添女人下面免费视频| 播五月开心婷婷综合| 亚洲不卡在线播放| 欧美自拍偷拍午夜视频| 国 产 黄 色 大 片| 精品国产一区av| 免费观看一级欧美片| 国产精品jizz视频| 色婷婷色综合| 黄色片视频在线播放| 不卡一区中文字幕| 午夜国产福利一区二区| 欧美一a一片一级一片| 五月婷婷六月丁香| 欧美大片第1页| 亚瑟国产精品| 亚洲高清资源综合久久精品| 亚洲一区日韩在线| 在线精品视频播放| 亚洲男人的天堂在线aⅴ视频| 一级全黄裸体免费视频| 国产亚洲精品美女久久久| 日本不卡1234视频| 国产伦精品一区| 韩日成人在线| 免费在线观看日韩av| 亚洲男人天堂av| 国产毛片毛片毛片毛片| 日韩中文字幕网址| 久久爱.com| 亚洲在线色站| 老司机午夜精品| 亚洲人与黑人屁股眼交| 欧美日韩一区视频| a√在线中文网新版址在线| 国产精品高潮呻吟久久av野狼| 国产日产精品_国产精品毛片| 男人天堂1024| 91视频www| 欧美国产成人精品一区二区三区| 亚洲国产精品久久久久久| 欧美hdxxxxx| 国产精品入口免费| 在线播放亚洲| 国产偷人妻精品一区| 欧美日韩激情网| 欧美另类自拍| 国产精品国语对白| 日本一二区不卡| 日本人69视频| 一区二区成人在线| 少妇精品视频一区二区| 91地址最新发布| 欧美人与拘性视交免费看| 国产裸体免费无遮挡| 国产日产亚洲精品系列| 亚洲特级黄色片| 欧美俄罗斯乱妇| 久久精品亚洲成在人线av网址| 国产69精品久久久久久久| 久久综合九色综合97婷婷女人 | 向日葵视频成人app网址| 日韩av在线电影观看| 美女视频第一区二区三区免费观看网站| 青青青视频在线播放| 91精品国产综合久久精品图片| 午夜小视频福利在线观看| 精品蜜桃传媒| 日韩精品乱码免费| 性欧美videos| 亚洲国模精品私拍| 日本欧美韩国| 免费观看黄色大片| www.亚洲激情.com| 无码人妻丰满熟妇区bbbbxxxx| 色婷婷**av毛片一区| 大型av综合网站| 999在线免费视频| 亚洲精品国产精华液| 日韩av成人| 亚洲free嫩bbb| 一本色道88久久加勒比精品| 中文字幕伦理片| 日韩精品一区二区三区三区免费 | 在线免费av一区| www.久久ai| 欧美日韩免费精品| 国产一区91精品张津瑜| 国产农村妇女aaaaa视频| www.国产精品一二区| 国内视频在线精品| 九一精品久久久| 精品国产91乱高清在线观看| 欧美激情午夜| 麻豆91av| 国产成人精品免费一区二区| 日本三级一区二区三区| 久久久久久久久电影| 亚洲电影影音先锋| 少妇按摩一区二区三区| 日韩视频一区二区三区在线播放|