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

寶貝,帶上WebAssembly,換個姿勢來優化你的前端應用

開發 前端
Comlink是一個由Google Chrome Labs開發的輕量級庫,它旨在簡化Web Worker與主線程之間的通信,讓我們能夠充分利用多線程處理的威力,提升前端應用性能。

前言

說起,「前端性能優化」,大家可能第一時間就會從網絡/資源加載/壓縮資源等角度考慮。

正如下面所展示的一樣。

圖片圖片

圖片圖片

圖片圖片

上面所列的措施,是我們常規優化方案。針對上面的內容我們有機會來講講該如何做。

而今天呢,我們和大家嘮嘮利用WebAssembly來優化前端渲染鏈路或者針對關鍵節點進行調優處理。

我們能所學到的知識點

  1. WebAssembly是個啥?
  2. 項目初始化&配置
  3. Rust項目初始化
  4. 處理耗時任務
  5. 圖像處理
  6. 優化音視頻
  7. 優化游戲體驗

1. WebAssembly是個啥?

WebAssembly是一種「二進制指令格式」,旨在在瀏覽器中高效執行。

  • 它「作為JavaScript的補充」,允許我們用Rust、C++和C等語言編寫性能關鍵代碼,并在瀏覽器中運行。
  • 通過將代碼編譯成Wasm,它變得「平臺無關」,并且可以以接近本地的速度運行。
  • Rust是一種以安全性和性能著稱的系統編程語言,由于其強大的保證和與Wasm的無縫集成,已經在WebAssembly生態系統中獲得了廣泛的關注。WebAssembly為網絡開發開辟了新的可能性,在一些復雜任務如游戲引擎、圖像處理等方面有著顯著的性能提升。

WebAssembly 的優勢

WebAssembly的一個最具說服力的特點是其在「計算密集型任務」中的性能提升。例如,在對龐大數據集進行復雜的統計計算時,WebAssembly 可能比常規的 JavaScript 快得多。這是因為 WebAssembly 的高度優化設計使得代碼執行速度遠遠超過 JavaScript。

WebAssembly 的另一個優點是其「可移植性」。跨平臺應用程序的開發變得非常簡單,因為可以從多種語言生成 WebAssembly 代碼,并在任何平臺上執行。

最后,「安全性」也是 WebAssembly 架構中的一個重要考慮因素。由于 WebAssembly 提供了沙箱執行環境,代碼無法訪問敏感數據或運行惡意代碼。

下面是了解和學習WebAssembly的RoadMap。

圖片圖片

2. 項目初始化&配置

進入正題之前,我們還是和之前一樣,使用我們自己的腳手架-f_cli_f[1]構建一個以Vite為打包工具的前端項目。

在本地合適的目錄下執行如下代碼:

npx f_cli_f create wasm_preformance

然后,我們在pages中新建如下的目錄結構:

圖片圖片

其中wasm存放的是我們已經構建好的wasm的資源。

配置Web Worker

由于我們在項目中會用到Web Worker,所以我們還需要對其做一定的配置。

而今天,我們再介紹另外一種更加優雅的方式 - Comlink[2]。

Comlink是一個由Google Chrome Labs開發的輕量級庫,它旨在簡化Web Worker與主線程之間的通信,讓我們能夠充分利用多線程處理的威力,提升前端應用性能。

由于,我們是用Vite搭建的前端項目,所以我們還需要在項目中借助vite-plugin-comlink[3]。

我們可以通過如下代碼安裝對應的依賴。

yarn add -D vite-plugin-comlink
yarn add comlink

然后,將對應的庫配置到vite.config.js中。

import { comlink } from "vite-plugin-comlink";

export default {
  plugins: [comlink()],
  worker: {
    plugins: () => [comlink()],
  },
};

這里有一點需要額外注意,comlink要放置在plugins第一個位置。

針對TypeScript項目,我們還需要在vite-env.d.ts中新增/// <reference types="vite-plugin-comlink/client" />。

然后我們就可以用優雅的方式來使用WebWorker了。

圖片圖片

可以看到,使用了comlink后,我們在使用多線程能力時,不需要寫那么多模板代碼,而是通過Promise來接收從子線程返回的數據。

配置WebAssembly

如果看過我們之前的文章(Rust 賦能前端 -- 寫一個 File 轉 Img 的功能)就對這塊不會陌生。

在Vite項目中使用WebAssembly我們需要配置vite-plugin-wasm[4]和vite-plugin-top-level-await[5]

然后,也是需要在vite.config.js的plugin和worker中進行相關處理。這里就不展開說明了。之前的文章有過解釋。

3. Rust項目初始化

在講項目頁面結構時說過,我們在組件目錄中特意有一個wasm目錄用于存放編譯好的wasm信息。

我們選擇wasm代碼和前端項目分離的方式,也就是我們會重新啟動一個Rust項目。

通過如下代碼在合適的文件目錄下執行。

cargo new --lib rust_comformation2web

然后,因為我們想要把Rust編譯成wasm并且還需要操作對應的dom等。所以,我們需要按照對應的crate。

安裝依賴

所以,我們來更新對應的Cargo.toml。

[package]
name = "rust_comformation2web"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2.92"
console_error_panic_hook = "0.1.7"
js-sys = "0.3.69"

[dependencies.web-sys]
version = "0.3.69"
features = [
    'Document',
    'TextMetrics',
    'CanvasRenderingContext2d',
    'HtmlCanvasElement',
    'Window'
]

然后,我們就可以在src/lib.rs寫我們對應的代碼了。

如果對自己的代碼質量不是很放心,并且又不想寫Test模塊了,我們將Rust所在的文件目錄,構建成一個Node項目(通過npm init),并配合對應的打包軟件(Webpack)來直接驗證wasm的效果。

圖片圖片

對應的webpack.config.js的配置如下:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    entry: './index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'index.js',
    },
    plugins: [
         new HtmlWebpackPlugin({
            template: 'index.html'
        }),
        new WasmPackPlugin({
            crateDirectory: path.resolve(__dirname, ".")
        }),
        // 讓這個示例在不包含`TextEncoder`或`TextDecoder`的Edge瀏覽器中正常工作。
        new webpack.ProvidePlugin({
          TextDecoder: ['text-encoding', 'TextDecoder'],
          TextEncoder: ['text-encoding', 'TextEncoder']
        })
    ],
    mode: 'development',
    experiments: {
        asyncWebAssembly: true
   }
};

然后,我們在package.json新增兩個命令

"scripts": {
    "build": "webpack",
    "serve": "webpack serve"
  },

我們就可以通過yarn serve查看效果亦或者yarn build執行對應的rust打包。

能夠實現這一切的功勞都是-@wasm-tool/wasm-pack-plugin[6]所賜予的。

編譯處理

但是呢,我們對Rust編譯處理不使用之前的yarn build,而是使用cargo自己的構建工具 - wasm-pack[7]。

wasm-pack build --target web --release

如果一切都正常的話,對應的wasm就會被打包到pkg文件夾下面了。

然后,我們就可以將所有文件復制到Vite項目中的wasm/xx目錄下。

最后,我們就可以在React組件中通過。

import init, { fib } from './wasm/xx';

引入對應的wasm函數了。

前面鋪墊了那么多,其實為了更好的講下面的內容,我們先把一些和邏輯代碼不相關的配置內容提前介紹了,這樣我們就可以將更過的注意力放在代碼實現上了。

4. 處理耗時任務

先說結果

圖片圖片

當執行一個處理耗時任務時,WebAssembly/JS WebWorker/JS主線程三者的執行時間是由低到高排列的。

WebAssembly < JS WebWorker<JS主線程。

針對上面的我們有幾點需要注意:

  1. JS WebWorker針對JS主線程優化率不是很高,(有時候worker執行時間甚至比JS主線程長)。
  2. WebAssembly通過至極的內存優化,還可以將優化率提高到50%以上。

聽我解釋

我們都知道JS是單進程的,所以我們在處理一些處理耗時任務就會很吃力。當然,我們也可以借助Web Worker來開啟新的子線程來緩解主線程的計算壓力。但是,在一些計算量特別大的功能面前,一切的計算都是收效甚微的。

其實,將一些處理耗時任務放置到Web Worker中只是不想讓耗時任務過多的占用主線程資源,從而讓頁面沒有卡頓的感覺。這就是大家所熟悉的瀏覽器在 1 秒鐘內完成 60 次圖像的繪制,用戶才會感覺頁面順暢。

為了在前端環境模擬處理耗時任務,我們采用在前端環境中執行一個fibonacci的計算過程。

在WasmPerformance的index.tsx中有如下的頁面操作。

圖片圖片

也就是說,我們在JS主線程/JS WebWorker/WebAssembly中分別執行一個耗時的fibonacci。

我們在tool.ts中構建了一個最簡單的fibonacci函數。

function fibJS(n: number): number {
  if (n < 2) {
    return n;
  }
  return fibJS(n - 1) + fibJS(n - 2);
}

對應的頁面代碼如下:

圖片圖片

從上面我們看到幾個關鍵的點:

我們用state來維護計算的結果和時間。

const [calculateInfo, setCalculateInfo] = useState<CalculateInfo>({
    js: { result: 0, executionTime: 0 },
    wasm: { result: 0, executionTime: 0 },
    webworker: { result: 0, executionTime: 0 },
  });

然后,我們在handleCalculate中執行不同的操作邏輯。

圖片圖片

其中measureExecutionTime是我們在tool定義的用于檢測指定函數被執行時的所用時間的函數。

function measureExecutionTime<T extends (...args: any[]) => any>(
  fn: T
): (...args: Parameters<T>) => { result: ReturnType<T>; executionTime: number } {
  return function (...args: Parameters<T>): { result: ReturnType<T>; executionTime: number } {
    const start = performance.now();
    const result = fn.apply(this, args);
    const end = performance.now();
    const executionTime = end - start;
    return { result, executionTime };
  };
}

還有,我們在handleCalculate在接收到type為3時,是觸發了一個wasm版本的fibonacci函數。

由于,對應的Rust代碼如下:

use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn fib(n: usize) -> usize {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2),
    }
}

而上面的Rust代碼會通過wasm-pack build --target web --release進行打包處理,并且打包后的相關內容被復制到了前端項目中wasm/calculate。

然后在組件中通過import init, { fib } from './wasm/calculate';方式來導入。

5. 圖像處理

先說結果

圖片圖片

圖片圖片

我們寫了兩個示例:

  1. 將指定文本信息繪制到圖片上
  2. 將特定圖形繪制到圖片上

無論是哪種情況,我們可以得出一個比較明顯的情況。

在圖像處理的部分功能點上,WebAssembly的性能遠高于JS。

因為,我們這里沒做WebAssembly的內存優化,當處理數據「超級大」時,由于數據傳輸的問題,反而WebAssembly的執行時間會比JS長。但是呢,這塊不在我們的討論范圍內。后期有機會寫相關的文章。

下面,我們就按照上面的示例來分別講講它們的代碼實現。有些代碼的邏輯其實很簡單,我們已經有對應的注釋,所以也不會用多余的篇幅解釋。

繪制文本到圖片上

對應的頁面結構如下:

圖片圖片

我們還是用了一個state來維護狀態信息。

const [drawInfo, setDrawInfo] = useState<DrawInfo>({
    js: { url: '', executionTime: 0 },
    wasm: { url: '', executionTime: 0 },
    js_circle: { url: '', executionTime: 0 },
    wasm_circle: { url: '', executionTime: 0 },
  });

然后在handleDraw中處理事件邏輯。

圖片圖片

其中drawTextToCanvas是利用JS來繪制文本到Canvas,而drawTextToCanvasWasm是利用wasm處理相關邏輯。

JS 版本的drawText

圖片圖片

該函數定義在tool.ts中,然后就是接收一個String類型的數據,并將其渲染到Canvas中。

Rust 版本的drawText

圖片圖片

然后,別忘記在頭部引入對應的crate。

use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement};
extern crate console_error_panic_hook;
use std::panic;

其實這塊的邏輯,和之前我們講的Rust 賦能前端 -- 寫一個 File 轉 Img 的功能的核心功能是類似的。

該函數通過wasm-pack編譯到pkg中,然后我們復制對應的文件到React項目的wasm/draw中。

然后我們通過如下代碼:

import init4Draw, {
  draw_text_to_canvas as drawTextToCanvasWasm,
  draw_circle_to_canvas as drawCircleToCanvasWasm,
} from './wasm/draw';

進行函數的導入。

繪制圖形到圖片上

對應的頁面結構和事件回調和之前是類似的,我們就省略了這部分的解釋。

JS 版本的drawCircle

該部分也是定義在tool.ts中:

圖片圖片

Rust 版本的drawCircle

圖片

此函數的處理過程和drawText是一樣的。

利用Photon操作圖形

針對圖片操作,不單單只有繪制文本/繪制圖案,其實我們還可以做類似(裁剪/新增水印/圖片翻轉等)。

我們可以借助一些成熟的WebAssembly來做上述的操作。這里呢,給大家推薦一個庫Photon[9]。

Photon 是一個高性能的圖像處理庫,用 Rust 編寫并可編譯為 WebAssembly,既可以在本地使用 Web 也可以在 Web 上使用。

這是它能做相關功能:

圖片圖片

6. 優化音視頻

寫到這里呢,我們就不在羅列相關代碼了。所以,我們給出一些針對音視頻的優化的解決方案。

在這里我們介紹一種wasm庫-ffmpeg.wasm[10]。

ffmpeg.wasm 是 FFmpeg[11] 的針對 WebAssembly / JavaScript 端口,支持在瀏覽器中錄制、轉換和流式傳輸視頻和音頻。它利用 Emscripten 來轉譯 FFmpeg 源代碼和許多庫得到。

具體的功能和庫如下:

圖片圖片

7. 優化游戲體驗

得益于WebAssembly極致的內存管理,然后其二進制特性,WebAssembly 提供接近本地執行速度的性能,使得復雜的游戲邏輯和高幀率的圖形渲染可以在瀏覽器中高效運行。

還得之前我們寫過Game = Rust + WebAssembly + 瀏覽器。

圖片圖片

還有,如果我們想要更多的效果,我們可以選擇使用bevy[12] - 一款基于Rust的數據驅動的游戲引擎。

然后我們還在itch.io[13]查看哪些游戲是用Rust寫的。

圖片圖片

責任編輯:武曉燕 來源: 前端柒八九
相關推薦

2018-09-03 11:57:28

大數據存儲Spark

2024-04-30 11:49:16

瀏覽器前端開發折疊屏應用

2023-01-31 09:02:24

JSVMVR

2021-05-08 08:35:33

Webpack前端性能

2019-07-29 10:39:39

前端性能優化緩存

2016-11-22 16:34:11

githubgit前端

2024-04-30 10:59:03

WebSocketCSS選擇器

2024-05-16 11:45:19

Rust項目代碼

2020-09-03 08:05:34

設計模式編程界

2015-08-03 15:29:28

Dynatrace

2012-09-13 11:13:26

IBMdw

2020-03-16 09:45:09

前端docker代碼

2024-09-30 09:25:29

2020-07-06 11:32:50

HTTPHTTP Header開發者

2020-09-04 15:38:19

Web前端開發項目

2018-06-13 10:27:04

服務器性能優化

2021-05-26 08:21:43

@Autowired項目@Resouce

2023-10-27 10:16:17

前端項目Rust

2022-11-02 07:37:07

WebAssembl瀏覽器服務器

2016-06-15 18:05:44

點贊
收藏

51CTO技術棧公眾號

999精品网站| 丝袜脚交一区二区| 国产成人精品三级麻豆| 91精品一区二区三区在线观看| 久久久久久成人精品| 久久精品免费网站| 亚洲 精品 综合 精品 自拍| **女人18毛片一区二区| 欧美在线观看一区二区| 好看的日韩精品| 天天看片中文字幕| 成人在线视频www| 国产精品美女久久久久aⅴ国产馆| 91超碰caoporn97人人| 欧美人与性动交α欧美精品| 麻豆视频在线观看免费| 日韩成人午夜| 亚洲午夜激情av| 91久久大香伊蕉在人线| 51精品免费网站| 成人在线观看免费播放| 久久久久国产免费免费| 538国产精品一区二区免费视频| 欧美一级片在线免费观看| av免费在线免费| 国产一区二区三区在线观看精品| 中文字幕亚洲欧美日韩2019| 91极品尤物在线播放国产| 国产黄在线看| 久久福利资源站| 久久手机免费视频| www.国产福利| 26uuu亚洲电影在线观看| www一区二区| 国产成人亚洲综合91| 国产精品久久久视频| 色噜噜成人av在线| 亚洲婷婷综合久久一本伊一区| 国产狼人综合免费视频| 操她视频在线观看| 成人国产精品久久| 91国在线观看| 正在播放精油久久| 国产免费一区二区三区最新不卡 | 国产97免费视频| 欧美一级精品片在线看| 欧美日韩视频在线观看一区二区三区 | 麻豆一区二区麻豆免费观看| 亚洲成精国产精品女| 九九九九精品| 成人毛片18女人毛片| 女厕嘘嘘一区二区在线播放 | 亚洲三级小视频| 杨幂一区欧美专区| www.国产免费| 国产免费成人| 日韩在线观看av| 中文字幕天堂av| 久久天堂av| 一区二区三区在线免费观看| 就去色蜜桃综合| 国产又粗又猛又黄| 99久久九九| 亚洲国产成人精品女人久久久 | 精品少妇一区二区三区免费观看| 精品国产免费av| 9色在线视频网站| 国产精品一区二区在线播放| 欧美一区二三区| 国产精品人人人人| 91精品久久久久久久蜜月| 日韩在线视频免费观看| av网页在线观看| 日本黄色成人| 日韩一二三区不卡| 久久婷婷国产91天堂综合精品| 婷婷综合六月| 亚洲成人综合视频| 亚洲 高清 成人 动漫| 黄色一级片在线观看| 91亚洲永久精品| 91嫩草免费看| 人妻丰满熟妇av无码区hd| 老司机免费视频一区二区| 97久久精品人人澡人人爽缅北| 国产aaaaaaaaa| 日韩高清三区| 亚洲视频在线视频| 中文字幕无码人妻少妇免费| 国产麻豆精品| 亚洲国产精品热久久| 久久久久亚洲av无码麻豆| 欧美色片在线观看| 91麻豆精品国产自产在线| 日本性生活一级片| 日韩在线二区| 国产亚洲精品va在线观看| 日韩成人av一区二区| 日韩国产一区二区| 久久久久久久久久久成人| 337p粉嫩色噜噜噜大肥臀| 亚洲欧美视频一区二区三区| 午夜精品视频在线| 怡红院成永久免费人全部视频| 亚洲影视综合| 国产一区视频在线播放| 中文字幕精品一区二| 国产iv一区二区三区| 日韩精品在在线一区二区中文| 丝袜视频国产在线播放| www..com久久爱| 精品婷婷色一区二区三区蜜桃| 丁香在线视频| 午夜久久久影院| 2018日日夜夜| 国产亚洲成av人片在线观看| 午夜伦欧美伦电影理论片| 亚洲精品20p| 国色天香久久精品国产一区| 7777精品伊人久久久大香线蕉| 中文在线字幕观看| 97精品中文字幕| 萌白酱国产一区二区| 亚洲欧美小视频| 日韩综合在线视频| 成人黄色av网站| hs视频在线观看| 成人性色生活片免费看爆迷你毛片| 99re国产| 亚洲三区在线播放| 一区二区三区 在线观看视频| 国产美女主播在线| 韩国主播福利视频一区二区三区| 日韩欧美在线观看视频| 最近免费中文字幕中文高清百度| 亚洲精品a区| 精品视频久久久| 免费成人深夜天涯网站| 亚洲深夜影院| 精品欧美一区二区精品久久| 电影k8一区二区三区久久| 欧美天天综合色影久久精品| 亚洲成年人在线观看| 在线日韩网站| 久久九九有精品国产23| 国产真人真事毛片| 视频一区国产视频| 免费看成人片| 欧美xo影院| 亚洲欧美日韩另类| 四虎精品免费视频| 国产自产v一区二区三区c| 亚洲人成77777| 久久久久久久性潮| 日韩视频国产视频| 亚洲av无码一区二区三区在线| 狠狠噜噜久久| 日本高清视频精品| 国产三级三级在线观看| 中文字幕一区二区三区在线观看| 2018日日夜夜| 日韩美女国产精品| 日本欧美国产在线| 精品国产亚洲av麻豆| 一二三四社区欧美黄| 真实乱偷全部视频| 亚洲毛片视频| 91成人免费在线观看| 中文国产字幕在线观看| 亚洲成人动漫在线播放| 久久精品视频5| 成人中文字幕合集| 国产成人精品视频免费看| 男男gay无套免费视频欧美| 国产精品入口日韩视频大尺度| 好吊视频一二三区| 日韩毛片视频在线看| 亚洲乱码中文字幕久久孕妇黑人| 中文成人在线| 国产一区二区三区精品久久久| 最近中文字幕免费在线观看| 26uuu久久天堂性欧美| 久久久久久久久久福利| 欧美国产一级| 国产美女精品久久久| 国产黄色免费在线观看| 欧美日韩成人综合天天影院| 偷拍女澡堂一区二区三区| 在线精品小视频| 国产免费一区视频观看免费 | 色综合色综合久久综合频道88| 国产又粗又猛又爽又| 一区二区中文视频| 成人影视免费观看| 韩国精品久久久| 在线观看国产一区| 久久成人福利| 国产精品一区二区三区成人| 丁香花在线电影小说观看| 中日韩午夜理伦电影免费| 丰满肉嫩西川结衣av| 在线一区二区三区四区| 91成年人网站| 久久精品动漫| 欧美一区二区影视| 欧美成人a交片免费看| 久久综合久中文字幕青草| 天堂网www中文在线| 555www色欧美视频| 在线永久看片免费的视频| 91麻豆免费看| 一起草最新网址| 日本麻豆一区二区三区视频| 视频一区亚洲| 久久亚洲人体| 欧美一级视频一区二区| 欧美hdxxxx| 亚洲精品国产精品自产a区红杏吧| 一区二区三区免费观看视频| 精品欧美aⅴ在线网站| ass精品国模裸体欣赏pics| 国产一区二区在线视频| 91最新在线观看| 亚洲免费综合| 大j8黑人w巨大888a片| 欧美区一区二| 国产乱码精品一区二区三区卡| 国产精品第一| 国产精品com| 韩国成人动漫| 日本午夜在线亚洲.国产| 2019中文字幕在线电影免费| 国产视频在线观看一区二区| 亚洲av色香蕉一区二区三区| 午夜成人免费视频| 欧美黑吊大战白妞| 亚洲男人的天堂在线aⅴ视频| 亚洲精品久久一区二区三区777| 美女尤物国产一区| 成人免费a级片| 亚洲最好看的视频| 蜜桃av色综合| 亚洲精品aaaaa| 欧美一级二级三级| 九一国产精品| 日韩精品大片| 青青草成人影院| 日韩av电影免费观看| 欧洲乱码伦视频免费| 99理论电影网| 亚洲国产aⅴ精品一区二区| 国产91精品青草社区| 在线天堂新版最新版在线8| 视频在线观看一区二区| 成人精品一区二区三区免费 | 天天爽夜夜爽视频| 国产成人免费在线观看不卡| 熟妇女人妻丰满少妇中文字幕| 国产精品综合一区二区| 久久久久久久久久久久国产精品| 国产福利视频一区二区三区| 免费黄色a级片| 91一区二区三区在线观看| 加勒比一区二区| 欧美国产一区视频在线观看| 久久精品无码专区| 99久久综合国产精品| 亚洲а∨天堂久久精品2021| 成人三级伦理片| 亚洲第九十七页| 国产一区二区三区四| 先锋资源在线视频| 97精品超碰一区二区三区| 亚洲性猛交xxxx乱大交| 99这里只有久久精品视频| 波多野吉衣中文字幕| 国产精品进线69影院| 久久一级黄色片| 亚洲欧美日韩人成在线播放| 久久久久久久九九九九| 欧美日韩另类在线| 亚洲一级特黄毛片| 在线视频你懂得一区二区三区| 亚洲一级黄色大片| 亚洲成人黄色网址| 91在线品视觉盛宴免费| 久久久噜噜噜久久| 最新日本在线观看| 3344国产精品免费看| 亚洲三级在线| 久久精品国产美女| 婷婷亚洲五月| 亚洲熟妇av一区二区三区| 韩国女主播成人在线观看| 国产麻豆天美果冻无码视频| 亚洲天堂av老司机| 日本a级c片免费看三区| 日韩欧美一卡二卡| 国产成人a人亚洲精品无码| 亚洲国产另类 国产精品国产免费| av在线首页| 8x拔播拔播x8国产精品| 国产亚洲字幕| 午夜老司机精品| 一区二区高清| 国产网站免费在线观看| 久久99九九99精品| 波多野结衣av在线观看| 亚洲影视在线播放| 亚洲一区二区影视| 亚洲日韩欧美视频一区| av人人综合网| 亚洲在线视频福利| 日本一区精品视频| 香蕉久久夜色| 六月丁香综合| 日韩aaaaa| 亚洲一区二区高清| 国产又粗又猛又黄| 一区二区三区视频免费| 中文字幕在线播放| 日本国产欧美一区二区三区| jizz国产精品| 裸模一区二区三区免费| 国产精品sm| 樱花草www在线| 国产精品一区二区无线| 国产精品1区2区3区4区| 91久久精品一区二区二区| 五月天婷婷在线播放| 欧美精品激情在线观看| 中文字幕一区二区三区中文字幕 | 精品国产乱码久久久久久老虎 | 日韩国产欧美| 欧美黑人经典片免费观看| 国产精品久久久久久久免费观看| 欧美色图色综合| 成人v精品蜜桃久久一区| 菠萝菠萝蜜网站| 亚洲一区欧美一区| 亚洲第一天堂影院| 久久99国产精品自在自在app | 久久看人人摘| 日本人视频jizz页码69| 国产日韩成人精品| 26uuu成人网| 制服丝袜中文字幕一区| 欧美激情午夜| 91在线直播亚洲| 中国成人一区| 美女伦理水蜜桃4| 亚洲妇女屁股眼交7| 四虎精品一区二区三区| 最近日韩中文字幕中文| av成人在线观看| 一区二区三区四区不卡| 国内成人精品2018免费看| 91嫩草|国产丨精品入口| 欧美一卡二卡三卡| 久久视频www| 九色91av视频| jizz性欧美23| 亚洲午夜无码av毛片久久| 久久综合久久综合亚洲| 日韩欧美中文字幕视频| 日韩欧美国产精品| 激情国产在线| 日韩偷拍一区二区| 激情图区综合网| 免费在线观看国产精品| 欧美日韩国产片| 成年视频在线观看| 国产人妖伪娘一区91| 亚洲草久电影| 中文成人无字幕乱码精品区| 在线一区二区视频| a免费在线观看| 激情伦成人综合小说| 日本不卡在线视频| 久久久久亚洲av无码专区体验| 亚洲精品97久久| 久久爱.com| 国产男女免费视频| 国产精品网站在线观看| 在线观看日本视频| 日韩性xxxx爱| 卡通动漫国产精品| 视色视频在线观看| 亚洲午夜免费视频| 蜜芽tv福利在线视频| 亚洲xxxx做受欧美| 欧美亚洲三级| 青娱乐在线视频免费观看| 亚洲少妇激情视频| 中文字幕久久精品一区二区 | 国产成人精品av久久| 中文字幕欧美精品在线| 欧美激情极品| www.99热这里只有精品| 国产精品美女视频|