国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

4個方面入手 TiledMap 地圖優(yōu)化!W字干貨分享

共 16284字,需瀏覽 33分鐘

 ·

2022-12-31 01:05

引言:如何進(jìn)行 TiledMap 地圖優(yōu)化?開發(fā)者 Bool Chen 將分享一套行之有效的 TiledMap 地圖優(yōu)化方案,其中包括了渲染、解析、尋路方面。


當(dāng)項目里的地圖越來越龐大和復(fù)雜,一些性能上的問題也開始逐漸出現(xiàn)。本文將從裁剪區(qū)域共享、Sprite 顏色數(shù)據(jù)去除、多圖集渲染合批和分幀尋路四個方面,分享關(guān)于 TiledMap 地圖的優(yōu)化以及實現(xiàn)。


測試用例


本次的測試用例是這樣的一張地圖,有6個圖層,其中4個圖塊層、2個物件層。測試的數(shù)據(jù)來源是在瀏覽器環(huán)境下,利用 console.timetimeEnd 函數(shù),打印對應(yīng)的邏輯耗時或渲染耗時,需要注意的是每次運行的耗時并不是一致的,但是在取均值后,可以認(rèn)為是相對可靠的。


優(yōu)化前后(注:橫軸是游戲運行的幀數(shù),縱軸是在該幀數(shù)下,對應(yīng)的耗時,單位是毫秒)


上圖是我們最后將裁剪區(qū)域共享+Sprite 顏色數(shù)據(jù)去除+多圖集渲染合批一起使用后的優(yōu)化效果,測試顯示渲染耗時大約降低了20%左右。其實這張地圖并不算復(fù)雜,如果物件數(shù)量、圖層數(shù)量增加的話,優(yōu)化效果會更加明顯。


本次的主要優(yōu)化方案參考自大城小胖的《如何重繪<江南百景圖>》,文章介紹了很多性能優(yōu)化技巧,強烈推薦大家去看看。項目基于 Cocos Cocos Creator 2.4.3,不過大部分優(yōu)化思路在 v3.x 依舊適用。限于篇幅,本文僅呈現(xiàn)部分核心代碼,完整代碼及測試項目源碼下載見文末。


裁剪區(qū)域共享


玩家操控人物在地圖上移動的時候,地圖顯示的內(nèi)容也需要跟隨人物的位置發(fā)生改變。此時,為了優(yōu)化性能,引擎會計算屏幕的可視范圍,只有在可視范圍內(nèi)的圖塊才會被渲染。


研究引擎中 TiledMap 地圖的渲染流程后我們發(fā)現(xiàn),其實 TiledMap 本身并不是渲染組件,地圖的渲染是通過圖層 TiledLayer 實現(xiàn)的,其對應(yīng)的渲染器是 TmxAssembler。渲染時,渲染流會逐個調(diào)用 TmxAssemblerfillBuffers 函數(shù)進(jìn)行渲染數(shù)據(jù)填充,此函數(shù)中會調(diào)用 CCTiledLayer_updateCulling 函數(shù)進(jìn)行可視范圍,只有可視范圍發(fā)生改變才會進(jìn)行渲染。


但是,在計算的時候,由于每個圖層都有對應(yīng)的 Assembler,所以每個圖層都會單獨計算一次。而一般情況下我們每個圖層顯示的范圍是一致的,所以我們希望它只計算一次就好了。


接下來我們就來實現(xiàn)裁剪區(qū)域共享(Share Culling),讓不同 TiledLayer 間,共享可視區(qū)域的裁剪計算結(jié)果,以此節(jié)約性能。


實現(xiàn)過程


首先我們繼承 TiledMap,重寫創(chuàng)建圖層的 _buildLayerAndGroup 函數(shù),實現(xiàn)創(chuàng)建自定義的 ShareCullingTiledLayer。


因為相對來說記錄第一個圖層實現(xiàn)起來更方便,所以我們緩存第一個圖層,并將首個 TieldLayer 傳遞給后面的圖層,方便后面去讀取計算結(jié)果。

_buildLayerAndGroup() {
  for (let i = 0, len = layerInfos.length; i < len; i++) {
    if (layerInfo instanceof cc.TMXLayerInfo) {
      // 創(chuàng)建自定義的ShareCullingTiledLayer
      let layer = child.getComponent(ShareCullingTiledLayer);
      // 傳遞、記錄首個TiledLayer
      layer._init(layerInfo, firstLayer);
      firstLayer = firstLayer || layer;
    }
  }
}


接著修改 TiledLayer 的裁剪函數(shù),一樣通過重寫的方式實現(xiàn)。


這里我們進(jìn)行判斷,如果是首個圖層,我們才讓他進(jìn)行計算,并把結(jié)果緩存起來;如果不是首個圖層,我們就直接讀取首個圖層的計算結(jié)果。


最后重寫 TiledLayer 的裁剪函數(shù),實現(xiàn)復(fù)用裁剪區(qū)域的功能。

_updateCulling() {
  // this._firstLayer為空時 表示為首個layer
  let firstLayer = this._firstLayer;
  if (!firstLayer) {
    // 進(jìn)行裁剪區(qū)域計算
    this._updateViewPort(); 
    this._cacheCullingDirty = this._cullingDirty;
  } else {
    // 直接復(fù)用firstLayer的結(jié)果
    this._cullingRect = firstLayer._cullingRect;
    this._cullingDirty = firstLayer._cacheCullingDirty;
    return
  }
}


很簡單地我們就完成了這個優(yōu)化。Share Culling 實現(xiàn)起來并不麻煩,但效果是顯著的。


優(yōu)化效果


優(yōu)化前后


可以看到即使只有6個圖層的情況下,裁剪函數(shù)的平均耗時降低了35%左右,當(dāng)圖層數(shù)量增加的時候,優(yōu)化效率會更高。

講到裁剪區(qū)域,這里還有一個優(yōu)化點。在初始化圖塊圖層時,引擎會遍歷整個地圖的圖塊,將所有圖塊的信息保存起來,方便后續(xù)使用。這里可以改成區(qū)域加載,一開始只解析當(dāng)前屏幕中的圖塊,隨后在移動的時候,再動態(tài)解析行動方向上的圖塊——當(dāng)然這個方案也有缺點,就是我們需要額外的內(nèi)存空間保存對應(yīng)的坐標(biāo)是否已經(jīng)解析過。


Sprite 顏色數(shù)據(jù)去除


接下來是物件顏色去除,這里我們用在地圖物件上,但其實這個優(yōu)化在所有 Sprite 組件中都是可以適用的。



Sprite 默認(rèn)的渲染頂點數(shù)據(jù)中包含了顏色數(shù)據(jù),但大部分情況下,美術(shù)給我們的素材我們都是直接放到游戲里,不會再對顏色做修改,此時 Color 數(shù)據(jù)似乎成了一個非必要的東西,將其去除掉可以減少 CPU 和 GPU 的數(shù)據(jù)傳輸,也可以省去著色器中對顏色的計算。


簡單講一下 Sprite 渲染流程。Sprite 組件會通過 resetAssembler 取得一個默認(rèn)的 Assembler,而 Assembler 會通過 updateRenderData 函數(shù),把 Sprite 的數(shù)據(jù)填充到 RenderData 中。最后引擎會幫我們把渲染數(shù)據(jù)傳遞給材質(zhì),進(jìn)而進(jìn)行渲染。


接著我們來看看怎么實現(xiàn)這個優(yōu)化。


實現(xiàn)過程


我們從底層步驟往上看,首先是著色器。仿照內(nèi)置的 EffectMaterial 創(chuàng)建 EffectMaterial,因為我們不再需要顏色了,所以只要把著色器中關(guān)于顏色的輸入輸出、計算等的代碼去除即可。

// 刪除顏色相關(guān)輸入輸出處理
CCProgram vs %{
  in vec3 a_position;
  // in vec4 a_color;
  // out vec4 v_color;
   void main () {
    // v_color = a_color;
    gl_Position = pos;
  }
}%

// 刪除顏色相關(guān)輸入、計算
CCProgram fs %{
  precision highp float;
  // in vec4 v_color;
   void main () {
    vec4 o = vec4(1111);
    CCTexture(texture, v_uv0, o);
    // o *= v_color;
    gl_FragColor = o;
  }
}%


接著我們要提供不帶顏色的渲染數(shù)據(jù)。繼承 cc.Assembler 實現(xiàn)一個新的 Assembler。在 Assembler 中,首先要新建一個頂點數(shù)據(jù)格式,將默認(rèn)的頂點格式中的顏色屬性去掉。隨后,為我們的新格式創(chuàng)建對應(yīng)的頂點數(shù)據(jù)容器。

// 自定義頂點格式,去掉默認(rèn)的顏色字段
let gfx = cc.gfx;
let vfmtNoColor = new gfx.VertexFormat([
    { name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
    { name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
    // { name: gfx.ATTR_COLOR, …},
]);
/**
 * 初始化this._renderData 創(chuàng)建自定義格式的renderData
 */

initData() {
  let data = this._renderData = new cc.RenderData();
  this._renderData.init(this);
   // 按我們自己的格式創(chuàng)建renderData
  data.createFlexData(046, vfmtNoColor);
}


最后,把渲染顏色的函數(shù)也移除掉。這樣就完成了一個不帶顏色的 Assembler。

    /**
     * 更新顏色 拜拜了??
     */

    // updateColor () {
        
    // }


接著我們需要使用這個 Assembler。重寫 Sprite 的 resetAssembler 函數(shù),將默認(rèn)的 Assembler 改成上面的 Assembler。

/**
 * 修改默認(rèn)Assembler
*/

_resetAssembler() {
  let assembler = this._assembler = new NoColorSpriteAssembler();
  assembler.init(this);
   this.setVertsDirty();
},


如果你要運用在其他地方,只要給 Sprite 換上前面的 material 就可以了。


那么如何運用在地圖物件中呢?我們通過繼承實現(xiàn)一個 TiledObjectGroup,并重寫 _init 函數(shù)。在里面,我們將默認(rèn)的 Sprite 組件改成我們自定義的組件,并賦予對應(yīng)的去除顏色的材質(zhì)即可。

_init(groupInfo, mapInfo, texGrids, noColorMaterial) {
  let objects = groupInfo._objects;
  for (let i = 0, l = objects.length; i < l; i++) {
    imgNode = new cc.Node();
    let sp = imgNode.addComponent("NoColorSprite");
    sp.setMaterial(0, noColorMaterial);
  }
}


優(yōu)化效果


優(yōu)化前后


最終優(yōu)化效果,在大約有100多個組件的情況下,渲染耗時降低了約12%。我在測試優(yōu)化效果的時候,發(fā)現(xiàn)這個數(shù)據(jù)有較大的浮動,范圍大約是5-15%。

在邏輯層面,我們減少了顏色數(shù)據(jù)的填充,本身優(yōu)化效果其實并不算大。其次,數(shù)據(jù)統(tǒng)計監(jiān)聽不到 CPU 和 GPU 數(shù)據(jù)傳輸?shù)牟糠?,也監(jiān)聽不到著色器優(yōu)化的部分。


另外,顏色數(shù)據(jù)的去除還可以為我們接下來的地圖物件多圖集渲染合批做準(zhǔn)備。


多圖集渲染合批


物件常常是地圖中不可或缺的一部分,世界觀豐富起來之后,物件來自不同的圖集也是很常見的,這個時候如果還要對物件進(jìn)行排序,圖集交錯的情況下,非常容易產(chǎn)生大量的 DC。


優(yōu)化 DC 的常見方案是打包圖集,但當(dāng)圖片來自不同圖集的時候,這個方案就無法進(jìn)行了。多圖集渲染合批是一個類似于打包圖集的方案,我們在渲染的時候,一次傳遞多張圖集,把原本的判斷圖片是否來自于同一張圖集,轉(zhuǎn)換為判斷圖片是否來自于同一批圖集。


大部分手機設(shè)備都可以支持8張圖集,所以理論上,只要使用的圖集不超過8張,就可以只要1次 DC。


實現(xiàn)過程


首先一樣需要修改著色器相關(guān)代碼。我們同樣復(fù)制一份內(nèi)置 Effect,之后在 Effect 的聲明中,增加一些 texture 參數(shù),來接收多張圖集數(shù)據(jù)。

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      properties:
        texture: { value: white }
        texture1: { value: white }
        texture2: { value: white }
        texture3: { value: white }
        // 4 5 6...
}%


隨后,通過頂點數(shù)據(jù)傳遞 texture_index,表示當(dāng)前使用的是哪張圖集。這里在著色器代碼中根據(jù) texture_index 從不同的圖集取值就可以了。

CCProgram fs %{
  precision highp float;
  in float texture_idx;
   void main () {
    vec4 o = vec4(1111);
     #if USE_TEXTURE
      if (texture_idx <= 1.0) {
        CCTexture(texture, v_uv0, o);
      } else if (texture_idx <= 2.0) {
        CCTexture(texture1, v_uv0, o);
      } else if (texture_idx <= 3.0) {
        CCTexture(texture2, v_uv0, o);
      } 
      // else ...
    #endif
     gl_FragColor = o;
  }
}%


現(xiàn)在我們要想辦法把這些數(shù)據(jù)傳遞給材質(zhì)。


先說 texture_index。這個部分和前面的組件顏色去除有點類似,不過這次是增加數(shù)據(jù)。我們自定義新的頂點數(shù)據(jù)格式,在里面增加一個 a_texture_index 屬性,之后創(chuàng)建一個新的頂點數(shù)據(jù)容器(注意 texture_index 聲明的位置,一會兒我們會用到)。

let gfx = cc.gfx;
var vfmtPosUvColorIndex = new gfx.VertexFormat([
  { name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
  { name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
  { name: "a_texture_idx"type: gfx.ATTR_TYPE_FLOAT32, num: 1 },
  { name: gfx.ATTR_COLOR, type: gfx.ATTR_TYPE_UINT8, num: 4, normalize: true },
]);

initData() {
  let data = this._renderData = new cc.RenderData();
  this._renderData.init(this);
   data.createFlexData(046, vfmtPosUvColorIndex);
}


完事之后,我們就要往這個容器中寫值,把數(shù)據(jù)傳遞給著色器。


新建 updateTextureIdx 函數(shù),進(jìn)行數(shù)據(jù)的填充。按照我們定義的頂點格式,在每個頂點的對應(yīng)位置填充 texture_index 屬性值。


隨后找出填充頂點數(shù)據(jù)的 updateRenderData 函數(shù),在里面增加對 updateTextureIdx 函數(shù)的調(diào)用,這樣就完成了數(shù)據(jù)的填充。

// 填充textureIndex數(shù)據(jù)
updateTextureIdx(sprite) {
  let textureIdx = sprite._textureIdx;
  let verts = this._renderData.vDatas[0];
   let verticesCount = this.verticesCount;
  let floatsPerVert = this.floatsPerVert;
   for (let i = 0; i < verticesCount; i++) {
    let index = i * floatsPerVert + 4;
    verts[index] = textureIdx;
  }
}

updateRenderData(sprite) {
  if (sprite._vertsDirty) {
    this.updateUVs(sprite);
    this.updateVerts(sprite);
    this.updateTextureIdx(sprite);
    sprite._vertsDirty = false;
  }
}


接著是傳遞圖集,我們?yōu)?objectGroup 傳遞一個 texture 變量,來保存所有物件圖層使用到的圖集。在創(chuàng)建完 objectGroup 之后,再按順序地把圖集傳遞給材質(zhì)。

_buildLayerAndGroup: function ({
  let layerInfos = mapInfo.getAllChildren ();
  let textureSet = new Set();
  for (let i = 0, len = layerInfos.length; i < len; i++) {
    let layerInfo = layerInfos[i];
    let group = child.getComponent("MutilObjectGroup");
    group._init(this.objectMaterial, textureSet);
  }
  // 設(shè)置材質(zhì)的texture屬性
  let objectTextures = Array.from(textureSet);
  for (let i = 0; i < objectTextures.length; i++) {
    let idx = i === 0 ? '' : i;
    this.objectMaterial.setProperty(`texture${idx}`, objectTextures[i], 0);
  }
}


接著看一下 objectGroup的部分。


我們實現(xiàn)新的 TiledObjectGroup,重寫 _init 函數(shù)。


除了 textureSet,我們同時維護(hù)一個 textureIndexMap,來記錄圖集在 set 中的位置。新建 Sprite 組件的時候,動態(tài)地去更新 TextureSetTextureIndexMap。


然后,我們利用 map 來獲得 Sprite 的 texture_index


需要注意的是,我們需要將材質(zhì)的哈希值寫死,否則更新圖集后,一樣會判定為不可合批。

_init(groupInfo, mapInfo, texGrids, material, textureSet) {
  // texture資源 -> textureIndex
  let textureIndexMap = new Map();
  Array.from(textureSet).forEach((texture, idx) => textureIndexMap.set(texture, idx));
  for (let i = 0, l = objects.length; i < l; i++) {
    let sp = imgNode.getComponent("MutilSprite");
    let spf = sp.spriteFrame;
     // 收集所有圖集
    let size = textureSet.size;
    textureSet.add(grid.tileset.sourceImage);
    // 更新Map
    if (size !== textureSet.size) {
      textureIndexMap.set(grid.tileset.sourceImage, size)
    }
     sp.setMaterial(0, material);
    // 設(shè)置textureIndex
    let index = textureIndexMap.get(sp.spriteFrame._texture);
    // 寫死哈希值 使其可以合批
    sp.getMaterial(0).updateHash(9999);
    sp.setTextureIdx(index + 1);
  }
}


優(yōu)化效果



優(yōu)化后,DC 從16降到了6,平均降低了13%的渲染耗時。而在復(fù)雜的環(huán)境下,不論物件產(chǎn)生了多少次 DC,最后的 DC 都會是6次,優(yōu)化效果也會提升。


因為相對默認(rèn)的渲染方式,我們額外增加了 texture_index 這個數(shù)據(jù),這會有一點性能損耗。但是如果和前面的顏色去除結(jié)合起來使用,就可以抵消這個損耗,達(dá)到更好的優(yōu)化效果。


此外,在圖塊圖層也有類似記錄圖集的操作。


初始化時,需要獲取圖層用到的所有圖集,并為他們創(chuàng)建對應(yīng)的材質(zhì),這里需要遍歷整張地圖。這里是一個優(yōu)化點,首先我們可以要求策劃拼地圖的時候每個圖層只使用一個圖集,這也可以避免多個圖集導(dǎo)致的 DC 上升。在這之后,我們可以修改對應(yīng)的代碼,只要找到一個圖集,就可以停止遍歷了,避免多次完整遍歷整張地圖。


分幀尋路



尋路是游戲中的重要部分,當(dāng)?shù)貓D面積增加時,尋路算法的損耗也會變成一個不可小視的部分。分幀的思路也是一個常見的優(yōu)化方法,我們把一件復(fù)雜的工作拆成好幾段,每幀做一段。它本身并沒有減少運算的數(shù)量,但是可以幫你壓平 CPU 的使用率曲線,避免突發(fā)的計算占用導(dǎo)致掉幀。


實現(xiàn)過程


在我們的尋路工具類里面提供一個接口,來進(jìn)行尋路任務(wù)的提交。


因為分幀處理后,代碼的執(zhí)行變成異步的了,所以我們需要緩存尋路任務(wù)的數(shù)據(jù)以及進(jìn)度,才能正確地接著上一幀的結(jié)果繼續(xù)處理。


之后,我們在游戲中每幀調(diào)用對應(yīng)的尋路函數(shù),進(jìn)行尋路的計算。


在進(jìn)行路徑計算的時候,我們每次訪問路徑點前,都先判斷已訪問的路徑點數(shù)量,如果超出了數(shù)量,就不再進(jìn)行尋路,等待下一幀的調(diào)用。

/**
 * 開始一個尋路任務(wù)。此函數(shù)為外部調(diào)用入口
 */

findRoad(start, target, wall, callback, config) {
  const { maxWalkPerFrame } = config;
  this._maxWalkPointAmount = maxWalkPerFrame || Number.MAX_VALUE;

  // ...存儲數(shù)據(jù)
   // 立即執(zhí)行一次尋路
  this._findPath();
}

/**
 * 此函數(shù)應(yīng)由外部引用者每幀調(diào)用
 */

update() {
  this._findPath();
}
/**
 * 執(zhí)行一次尋路
 */

_findPath() {
  let walkPointAmount = 0;
   while (walkPointAmount++ < this._maxWalkPointAmount) {
    // 訪問路徑點...
    const point = this._waitQueue.poll();
  }
}


優(yōu)化效果


優(yōu)化前后


測試用例是在游戲開始時,提交了四個尋路任務(wù)。可以看到優(yōu)化前的時間消耗接近 8ms,這對我們來說是不可接受的。在優(yōu)化后,最高的耗時也不過 1ms。相對來說是一個可以接受的數(shù)字。


除了分幀處理,我們還可以再進(jìn)一步地進(jìn)行優(yōu)化。


比如游戲世界剛啟動的時候,所有的 NPC 都需要進(jìn)行隨機移動,這個時候會有大量的 NPC 需要同時進(jìn)行尋路運算,仍然會導(dǎo)致 CPU 占用率過高。這里有兩個方案,一個是讓 NPC 在不同的時機點開始移動,另一個是對尋路任務(wù)進(jìn)行統(tǒng)一的管理。這里介紹一下后一個方案。


我們可以將提交的尋路任務(wù)保存到隊列中。只有當(dāng)尋路任務(wù)完成的時候,我們才從隊列中取出新的任務(wù)。

/**
 * 添加一個尋路任務(wù)。此函數(shù)為外部調(diào)用入口
 * @param {FindRoadTask} task 尋路任務(wù) 
 */

addFindRoadTask(task) {
  if (this._finding) {
    this._taskList.push(task);
  } else {
    this._startFindRoadTask(task);
  }
}
/**
 * 尋路任務(wù)結(jié)束回調(diào)。不論尋路成功或失敗都會調(diào)用本函數(shù)
 */

_onFindOver() {
  if (!!this._taskList.length) {
    this._startFindRoadTask(this._taskList.shift());
  } else {
    this._finding = false;
  }
}


如此一來,就可以保證我們每幀同時只會執(zhí)行一個任務(wù),進(jìn)一步地壓平曲線。我們用同樣的測試用例進(jìn)行測試,結(jié)果如下。


優(yōu)化前后


需要注意一下,這里的藍(lán)色線就是剛剛優(yōu)化后的綠色線??梢钥吹骄G色線又進(jìn)一步地更平緩了,最高也不超過 0.5ms,我們可以不用再擔(dān)心尋路會對幀數(shù)造成影響了。


總結(jié)與資源下載


如果把本文介紹的優(yōu)化全做了是什么效果?



開頭提到,這里我們測試了裁剪區(qū)域共享+顏色去除+多圖集渲染合批,渲染耗時大約降低了20%左右。


完整代碼與測試項目歡迎移步下方論壇專貼查看與下載,如有疑問、或是其他好的優(yōu)化方案,都可以在論壇一起交流!


論壇專貼地址


裁剪區(qū)域共享(Share Culling):

https://forum.cocos.org/t/topic/134525

Sprite 顏色數(shù)據(jù)去除:

https://forum.cocos.org/t/topic/135235

多圖渲染合批:

https://forum.cocos.org/t/topic/136349

分幀尋路+尋路任務(wù)統(tǒng)一管理:

https://forum.cocos.org/t/topic/134884


往期精彩


瀏覽 45
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产原创精品| 高清视频无码| 国产视频999| 福利视频一区二区| 91探花秘在线播放偷拍| 91农村站街老熟女露脸| 久久91欧美特黄A片| 欧美一二区| 亚洲AV无码国产精品| MAD033_后宫秘密陶子.| 99在线精品视频在线观看| 中文字幕成人网站中文字幕| 婷婷无码成人精品俺来俺去| 日韩成人一级片| 无码V| 一区二区三区精品视频| 国产精品成人免费精品自在线观看 | 操美女91| 亚洲无码av在线观看| 中文成人无字幕乱码精品区| 日韩中文字幕电影| 一区二区亚洲| 国产美女久久久| 午夜丁香婷婷| 黄视频在线观看免费| 亚洲天堂色| 亚洲无码视频免费观看| 日韩操大屌| 国产激情综合在线| 中文字幕亚洲无码视频| 99在线视频精品| 日韩激情片| 婷婷激情四射| 后入少妇视频| 久久精品水多多www| 综合网操笔| 无码精品一区二区在线| WWW色色| 色色国产| 久久这里都是精品| 曰本精品综合网在线| 二区三区无码| 久热思思| 91成人导航| 亚洲人人操| 日本一级婬片A片免费看| 激情五月天激情网| 亚洲另类天堂| 日韩黄片视频| 秋霞二区| 不卡的AV| 中文无码播放| 女人的天堂AV| 亚洲av无码精品| 久久婷综合| 五月涩| 操逼网站免费| 香蕉大综合| 无码视频在线免费播放| 亚洲中文字幕影院| 男女日逼| 91女色| 内射欧美| 日韩AV一区二区三区| 欧美亚洲综合在线观看| av在线天堂网| 日韩精品电影| 日韩性爱一区二区| 夜夜骑天天| 色噜噜AV| 亚洲无码免费| www.午夜福利| 青春草免费视频| 91嫩草欧美久久久九九九| 九九色色| 啪啪网站免费观看| 亚洲狠狠操| 強暴人妻一区二区三区| 女公务员人妻呻吟求饶| 奇米影视77777| 成人性爱在线观看| 无码日韩电影| 国产精品VA| 777777视频| 噼里啪啦免费观看视频大全| 丰满人妻一区二区三区视频54| 在线无码人妻| 玖玖中文字幕| 婷婷久久网| 韩国av在线| 国产精品v欧美精品v日韩精品 | 欧美在线观看一区二区| 麻豆md0049免费| 手机免费av| 精品日韩AV| 俺去俺来也www色官网cms| 俺去操| 国产亚洲无码激情| 人人搞人人摸| 无码日韩成人| 北条麻纪无码视频| 超碰人人干| 国产最新AV| 中文字幕99| 久久亚洲中文| 五月天婷婷激情视频| 国产激情小视频| 久久99高清| 五月天欧美性爱| 天天爽夜夜爽精品成人免费| 国产操逼大全| 操你久久| 天堂网在线播放| 无码视频一区二区三区| 人妻人人爱| 九九成人精品| 亚洲无码AV电影| 黄色免费视频网站| 蜜臀99久久精品久久久久久软件| 97人妻人人操| 久久夜色精品国产噜噜亚洲AV| www操逼| 蜜桃AV在线观看| 亚洲精品日韩无码| 国产白浆一区二区三区| 大香蕉性爱| 日韩av小说| 日韩黄视频| 日本在线不卡视频| 精品一区二区三区在线观看| 春色Av| 日韩一级黄色毛片| 国产91一区在线精品| 四川BBBBBB搡BBBBB| 激情性爱婷婷色五月| 内射视频网| 水蜜桃网址| 一区二区三区四区成人| 五月婷在线| 欧美AAAAA| 国产在线免费视频| 久久午夜福利视频| 欧美高潮喷水| 中文字幕无吗| 色丁香五月婷婷| 91人人妻人人做人人爽| 91成人精品视频| 日韩在线观看AV| 日逼中文字幕| 高清免费在线中文Av| 国产逼| 一区二区三区福利| jizz视频| 一区无码精品| 国产精品内射婷婷一级二| 成人做爰100片免费着| 一级特黄大片录像i| 日韩精品视频免费| 日韩免费AV| 狠狠干b| 日韩午夜无码| 久操国产| 欧美中文字幕视频| www.青青草视频| 91乱子伦国产乱| 天天干天天射天天| 91探花足浴店少妇在线| 日本做爱视频| 一道本视频在线| 99精品视频在线观看免费| 欧美成人手机在线看片| 黑人又粗又大XXXXOO| 久久艹国产| 日韩毛片一区二区| 麻豆成人91精品二区三区| 最新无码在线| 在线日韩国产| 日韩精品视频在线| 久久久久电影| av免费观看网址| 国产精品大香蕉| 喷水在线观看| 日本高清视频网站| 人人操人人干人人摸| 老太老熟女城中层露脸60| 亚洲无码在线观看免费| 福利导航网| 熟女人妻一区二区| 日日干天天日| 黄色www| 人成免费在线视频| 西西人体BBBBBB| 亚洲视频在线看| 影音先锋av无码| 日韩日逼网站| www.zaixianshipin| 天天摸夜夜操| 无码视频在线免费播放| 精品少妇视频| 全国最大成人网站| 精品黄色片| 天天舔九色婷婷| 国产欧美精品成人在线观看| 亚洲欧美视频在线| 中文字幕在线一区二区a| 美女少妇激情BBBB| 中文字幕的| 国产综合久久久7777777| www.日韩av| 99精品久久| 人人cao| 西西www444无码大胆| 日本午夜视频| 深夜福利18| 黄色视频日本免费| 国产精品H| 天天日夜夜| 亚洲视频在线免费看| 欧美狼友| 亚洲成人一区二区三区| 免费亚洲无码| 国产黄色免费电影| 亚洲天堂在线视频播放| 国产伊人自拍| 欧美一级二级三级| 人人草人人摸人人看| 无码视频中文字幕| 免费视频一二区| 亚洲秘AV无码一区二区qq群| 中文字字幕在线中文乱码电影| 香蕉国产2023| 色噜噜人妻av中文字幕| 亚洲青草| 91啦丨露脸丨熟女色啦| 亚洲超碰在线观看| 欧美日韩性色无码免费| 日韩不卡免费| 轻轻操内射无码| 午夜无码福利| 91草视频| 欧美伦妇AAAAAA片| 久草国产在线视频| 天天干,天天日| 国产女主播在线播放| 亚洲五月婷婷| 亚洲成人三区| 亚洲第一av| 日日操日日摸| 激情丁香五月婷婷| 国产亚洲视频免费观看| 2020人妻中文字幕| 11孩岁女精品A片BBB| 在线观看欧美日韩| 中国老女人操逼视频| 日本黄色录像| WWW久久久| 亚洲男女免费视频| 黄频视频| 毛片自拍| 天堂中文网| 丁香五月社区| jizz视频| 嫩BBB槡BBBB槡BBBB视频-百度 | 亚洲无码av在线观看| 日本熟妇无码一区二区| AⅤ天堂| 日韩性网| 成人A片视频| 99人妻视频| 欧美精品成人在线| 色色婷婷五月| 青青草在线免费视频| 伊人综合影院| 色噜噜一区二区三区| AV香蕉| 中字AV| 人人爽亚洲AV人人爽AV人人片| 91成人做爰A片| 日本a视频| 男女爱爱动态图| 亚洲无码一区二区三区| 伊人久久免费| 亚洲精品视频免费观看| 国产成人精品无码| 99热日本| 春色AV| 中文字幕无码在线观看视频| 一区二区三区不卡在线| 亚洲欧洲免费看| 欧洲成人无码| 亚洲中文字幕日本| 丁香花免费高清视频小说完整| 午夜神马51| 污污污污污www在线观看优势| 91大熟女91大腚女人| 欧美日韩亚洲一区二区三区| AV女优天堂| 曰韩一级A片| 乱人伦欲国语对白| 你懂得视频在线观看| 欧美自拍第一页| 国产超碰青青草| 人人看,人人摸| 无码人妻精品一区二区蜜桃漫画| 免费黄色视频在线| 色婷婷视频网站| 熟女视频91| 超碰人人人人人| 人妻大屁股-91Porn| 嫩草视频网站| 亚洲精品国产精品国自产曰本| 无码AⅤ一区二区三区| 操屄视频在线观看| 久草福利在线观看| 亚洲18禁| 视频一区二区免费| 中文字幕免费毛片| 特级西西WWW无码| 久久成人无码电影| 美女天天干| 黄色人妻| wwwxx国产| 人妻av无码| 久久久久久久久久8888| 中文字幕777| 九色影院| 亚洲免费婷婷| 狼人香蕉在线视频| 免费无码婬片AAAAA片| 日韩三级片在线播放| 91操b| 婷婷综合久久| 免费亚洲无码| 人妻在线观看| 黄色视频在线免费观看高清视频 | 五月丁香在线观看| 国产精品自拍一区| 日韩在线二区| 成人精品三级麻豆| 无码人妻av黄色一区二区三区| 国产av一区二区三区| www插插| 精品成人AV| 国产精品成人在线| 日本三级片在线动| 四季AV一区二区夜夜嗨| 成人视频黄片| 国产精品性爱| 三级毛片在线| 亚洲一级Av无码毛片久久精品| 99久久综合国产精品二区| 丁香六月婷婷综合激情欧美| www.一区二区三区| 国产曰韩欧美综合另类在线 | 国产主播一区二区| 国产成人影视在线观看| 午夜视频在线播放| 中文字幕你懂的在线三级| 亚洲操操操操| 亚洲成人第一页| 日韩精品人妻中文字幕蜜乳| 亚洲秘无码一区二区三区胖子| 婷婷五月激情小说| 亚洲三级片无码| 伊人天天干| 亚洲天堂天天| 人妻少妇综合| 色天天干| 91天天综合| 国产女人18毛片水18精| 久久久久99精品成人片直播| 7777影视电视剧在线观看官网 | 91麻豆精品| 亚洲三级无码在线| 欧美一级性爱| 精品亚洲成人| 国产无遮挡又黄又爽又色学生软件 | 一级黄色片网站| 狠狠操狠狠| 大香蕉伊人综合在线| 久久五月天婷婷| 免费三级毛片| 国产操逼无码| 日韩高清无码不卡| 波多野结衣Av在线| 日本a片在线观看| 黄色a片在线观看| 欧美丰满老熟妇XXXXX性| 国产高清无码免费视频| 91亚洲国产AⅤ精品一区二区| 国产精品一级无码免费播放| 麻豆性爱视频| 777国产盗摄偷窥精品0000| Av一区二区三区| 日韩AV无码专区亚洲AV紧身裤| 国产精品免费观看视频| 久久精品操| 肉乳无码A片av| 91网站在线免费观看| 久久午夜影院| 色欲天天网| 亚洲无码视频观看| 欧美色影院| 全国最大成人网站| 国产无码AV| 欧美a在线| 九色PORNY国产成人| 午夜激情网站| 一区在线免费观看| 国产无码AV大片| 91丨露脸丨熟女抽搐| 在线观看免费黄| 国产精品香蕉| 国产精品免费人成网站酒店| 国产1页| 一级内射片在线网站观看| 乱伦性爱视频| 国产69视频在线观看| 日韩中文字| 91精品日韩| 欧美精品一区二区少妇免费A片| 91乱子伦国产乱| 国产精品自拍一区| 一本色道久久88加勒比| 国产精品国产三级国产AⅤ| 成人福利在线| 青青色视频| 中文字幕不卡AV在线观看| 69色综合| 国产嫩草影院| www.91自拍| 青青草黄色视频| 波多野结衣av在线| 波多野结衣亚洲视频| 亚洲北条麻妃一级A片| 91精品大屁股白浆自慰久久久 | 特一级A片| 四川少妇BBw搡BBBB槡BBBB| 日韩成人网站在线观看| 婷婷手机在线| 亚洲国产三级片| 动漫3D成人H无码国漫| 国产骚妇| 老司机视频在线视频18| 蜜臀AV成人| 久久艹大香蕉| 麻豆AV片| 国产男女性爱视频播放| 亚洲中文字幕免费视频| 亚洲国产中文字幕在线播放 | 大地av| 91国黄色毛片在线观看| 无码人妻精品一区二区三区蜜桃91 | 精品国产AV无码一区二区三区| 青青操在线观看| 黄色视频免费在线观看网站| 97男人的天堂| 欧美三级电影在线观看| 青青草91在线| 精品乱子伦一区二区三区,亚洲国产成| 欧美操逼网址| 天堂视频中文在线| 欧美精品久久久久久| 国产高清免费无码| 日韩丰满人妻| 日韩免费无码| 12—13女人毛片毛片| 欧美又粗又大AAA片| 日韩伊人| 国产AⅤ无码一区二区| 91人妻人人澡人人爽人人精品| 91精品内射| 人人妻人人澡人人DⅤD| 青青av| 国产日韩一区二区| 青青激情视频| 爽好紧别夹喷水网站| 青在线视频| 国产三级偷拍| 免费无码国产在线观看| 围内精品久久久久久久久久‘变脸| 无码乱伦AV| 香蕉成人电影| 精品久久一区二区三区四区| 成人无码欧美大片免费看| 久热精品视频在线观看| 182av| 巨乳一区二区三区| 亚洲性网| 日韩AV中文| 久久成人影音先锋| 精品无码国产一区二区三区51安| 躁BBB躁BBB躁BBBBB乃| 精品热99| 天天天日天天天操| 欧美AAAAAA| 大香蕉免费网| 猫咪亚洲AV成人无码电影| 日日av| 思思在线视频| 制服丝袜一区| 91干穴穴在线观看| 日本高清一区| 3D动漫精品啪啪一区二区竹笋| 福利黄色片:片| 亚洲资源网| 日本黄色录像| 狠狠干2022| 黄片视频免费| 五月天av在线| 中文字幕在线乱| 日韩精品影视| 91视频免费网站| 黄色片a片| 嫩BBB搡BBBB搡BBBB| 欧美日韩成人电影| 久久成人三级片| 超碰人人人人人人人人| 日韩无码人妻久久一区二区三区 | 久久婷婷视频| 人妻成人网| 国内精品久久久久久久久久变脸| 五月欧美激情| 黄片伊人| 色综合综合色| 手机看片亚洲| 色五月婷婷视频| 中文字幕视频在线观看| 国产操比视频| 日韩一区不卡| 亚洲精品色婷婷| 操噜噜噜噜噜插| 国产A视频| 精品无码一区二区三区免费| 午夜成人无码视频| 国产福利视频| 中文在线观看视频| 国产高清A片| 潮喷AV| 欧美日韩在线观看一区| 黄色性爱小说| 国产一级A| wwwxx国产| 亚洲无人禁区| 欧美性爱一区| 91色综合| 无码人妻少妇| 天天干夜夜操| 奶大丰满一乱一视频一区二区三区在| 国产久久在线| 无码秘人妻一区二区三-百度| 亚洲色图五月天| 亚洲成人自拍无码| 国产成人精品AV| 一本道在线无码| 亚洲丁香网| 久久久久亚洲AV无码专区| 日韩无码高清免费视频| 亚洲第一伊人| 草逼小视频| 国产一级麻豆| 中文字幕天堂在线| 操B视频在线| 欧美日本成人网站入口| 无码中文av| 日本翔田千里奶水| 韩日在线视频| 亚洲欧美日韩成人| 婷婷成人五月天| 操逼视频网| 欧美一级片在线| 日韩免费中文字幕| 日韩色情网| 最新中文字幕无码| 干欧美美女| 爱搞视频在线观看| 国产A视频| 四虎在线观看一区网址| 国产家庭乱伦| 日韩欧美在线免费| 国产成人A∨| 搞黄免费视频视频| 亚洲最大成人网站| 亚洲精品无码久久久| 日韩视频网址| 午夜久久视频| 91逼| 国产一级性爱视频| 午夜操逼| 日韩国产AV| 操小骚逼视频| 自拍乱伦| 久久久久久久久久成人永久免费视频| 四川少妇搡bbbb搡bbbb| 99视频在线免费观看| 久久精品国产视频| 日韩va中文字幕无码免费| 江苏妇搡BBB搡BBBB| 无码视频久久| 久久超碰99| 精品国产一级A片黄毛网站| 亚洲高清无码免费在线观看| 91老熟女| 91九色口爆吞精| 三级三级久久三级久久18| 国产玖玖| 西西444WWW无码大胆知乎| 免费黄片在线| 国产AV剧情| 99久久久久久久久久| 亚洲欧美激情视频| 暗呦罗莉精品一区二区| 怡红院成人网| 人人爽人人爽人人爽| 国产又爽又黄免费视频免费| 在线免费观看中文字幕| 日韩无码影视| 激情综合网五月| 国产精品扒开腿做爽爽爽视频| 国产免费观看AV| 亚洲无码成人AV| 肏逼在线观看| 国色天香一区二区| 伊人久久综合| 日韩欧美一级片| 免费a网站| 操欧美逼| 亚洲成人av在线观看| 狠狠干干| 无码偷拍| 国产麻豆精品成人毛片| 影音先锋麻豆| 69精品在线| 53岁露大奶熟女偷情贴吧| 在线免费观看av网站| 91网站在线免费观看| 中国黄色一级A片| 国产粉嫩小泬白浆18p| 土耳其电影《爱与罚》| 黄网站在线观看| 亚洲天堂无码在线| 9I成人免费版| 日韩无码播放| 欧美综合色| 久久精品9| 免费看一区二区三区| 国产日韩在线观看视频| 嫩草视频网站| 色色色亚洲| 日韩一片| 亚洲小视频在线播放| 粉嫩小泬BBBBBB免费看| 精品国内自产拍在线观看视频| 亚洲三级无码在线| 国产在线一区二区三区四区| 成人丁香五月天| 黄色爱爱视频| 亚洲日本无码50p| 男人午夜网站| 大蕉伊人网| 亚洲午夜福利视频在线观看| 在线观看一级片| 日韩AV无码高清| 婷婷爱五月天| 97精产国品久久蜜桃臀| 91香蕉视频在线看| 久久精品国产AV| 色婷婷欧美在线播放内射| 天堂av中文字幕| 91av在线免费播放| 成人综合大香蕉| 午夜视频18| 密臀91| 日韩操逼av| 97在线资源| 北条麻妃成人视频| www.午夜福利| 色色综合热| 99精品视频免费在线观看| 人成在线视频| 亚洲人免费视频| 一区二区三区www污污污网站| 青娱乐精品在线视频| 91无码人妻精品1国产四虎| 亚洲AV成人无码一区二区三区| 国产剧情一区二区三区| 97精品一区二区三区A片| 久草资源在线观看| 欧美av| 91高清在线| 国产精品免费一区二区三区都可以 | 日韩AV综合| 91欧美视频| 少妇搡BBBB搡BBB搡造水爽| 狠狠一区| 日韩色情视频| 爱视频福利| 伊人大香蕉在线视频| 亚洲AV在线观看| 青娱乐三级在线免| 日韩一级一片内射视频4K| 亚州精品国产精品乱码不99勇敢| 久久青青婷婷| 插菊花综合网亚洲| 最好看2019中文在线播放电影| 日韩大片在线| 亚洲无码av网站| 国产亚洲精品久久久久久桃色| 狠狠干综合网| 无码视频在线看| 九九久久综合| 综合在线视频| 老司机免费视频| 亚洲专区免费| 91三级片| AAA片网站| 五月婷婷啪| 亚洲无码免费在线视频| 草b在线| 91欧美亚洲| 色诱AV| 中文字幕成人视频| av无码电影| 99热自拍| 国产操片| 俺去俺来也在线www色官网| 龙泽美曦土豪| 无码不卡一区| 亚洲网站在线免费观看| 少妇的屄| 天天拍天天射| 日韩在线视频中文字幕| 苍井空一区二区三区| 日韩一级在线播放| www.sese| 国产成人秘一区二区三区东京热| www.操操网| 国产婷婷精品| 色色色色AV| 色呦呦视频在线观看| 欧美sesese| 日本一本不卡| 波多野结衣成人在线| 91精品婷婷国产综合久久竹菊| 91超碰在线| 大香煮伊在75| 亚洲成人在线一区| 久久综合色色| a√天堂中文在线8| 成人a视频| 国产精品久久久久久久久久久免费看 | 中文字幕+乱码+中文乱码91在线观看 | 黑人猛躁白人BBBBBBBBB| 黄色一级在线观看| 超碰精品在线| 久久久一区二区三区四区免费听| 翔田千里无码流出两部| 亚洲欧美另类图片| av网站免费在线观看| 天天干在线观看| 精品资源成人| 婷婷网址| 婷婷五月天丁香| h在线观看h| 日韩A片免费观看| 国产乱子伦一区二区三区在线观看 | 欧美性爱操逼视频| 夜夜撸夜夜操| 人人妻天天干| 亚洲中文综合| 伊人五月天激情| 99中文字幕| 中国免费视频高清观看| 俺去啦俺去也| 亚洲秘无码一区二区| 91人人妻人人操| 亚州天堂| seseav| 黄网站免费观看| va色婷婷亚洲在线| 三级无码在线播放| 三级片无码麻豆视频| 日韩无码二区| 欧美一区二区三区四区视频 | 国产探花一区二区三区| 国产高清无码在线观看视频| 台湾成人视频| 久草福利在线观看| AV三级片网站| 一本久久综合亚洲鲁鲁五月天| 九九九欧美| 安徽妇搡BBBB搡BBBB| 婷婷精品| 超碰天天干天天摸| 国产精品啪啪啪啪| 日韩一级成人片| 中文字幕高清在线| 伊人网址| 婷婷免费| 动漫3D成人H无码国漫| 欧美在线无码| 国产精品永久| 99热免费| 无码成人网| 欧洲AV在线| www.色悠悠| 日韩在线视频免费观看| 国产一级a毛片| 婷婷三级| 91成人无码看片在线观看网址| 五月天久久久| 手机看片午夜福利网| V片免费看| 国产美女AV| 五月天av在线| 性感91影院| 69成人国产| 欧美日韩免费在线| 亚洲一级在线观看| 国产精品18在线| 国产剧情一区二区| 亚洲视频在线视频| 欧美熟妇精品黑人巨大一二三区| 啪啪啪免费网站| aa在线| 大香蕉网伊人在线| 亚洲做爱视频| 伊人网站| 六月婷婷在线| 日韩黄色片网站| 91免费小视频| 国产免费黄色av| 成人大香蕉视频| 婷婷爱五月| 国产高清免费视频| 天天爽天天爽夜夜爽| 精品视频999| 亚洲免费观看高清完整版在va线 | 亚洲高清人妻| 亚洲AV无码乱码国产精品黑人 | 成人网视频| 综合插插| 国产午夜精品一区二区三区牛牛| 久久久久久久91| 在线观看免费黄色视频| 星空AV| 天天日狠狠操| 欧美精品综合| 福利黄色片:片| 在线免费看黄视频| 婷婷激情久久| 亚洲在线| 18禁网站在线播放| 激情丁香婷婷| 91人妻成人精品一区二区| 手机在线一区| 久操婷婷| 黄页网站免费在线观看| 国产三级国产三级国产普通话| 亚洲日逼网| 婷婷五月天国产| 99久久国内精品成人免费| 国产人成视频| 欧美日韩大香蕉| 日韩无码中字| 7777精品伊人久久7777| 国产亚洲久一区二区三区| 日韩欧美黄色| 色哟哟视频在线观看| 夜夜夜叫天天天做| 日韩无码电影网站| 国产精品AV片| 欧美日韩中文字幕在线视频| 骚逼av| 波多野结衣成人网站| 五月丁香婷婷基地| 9I免费看片黄| 性欧美成人播放77777| 日韩一级免费在线观看| 亚洲色情在线观看| 少妇激情网站| 亚洲精品久久久久毛片A级绿茶| 久久男人网| 国内自拍激情视频| 99国产精品久久久久久久成人| 91成人一区二区三区| 久久久97精品久久| 成人免费乱码大片a毛片蜜芽| 国产精品一区二| 日韩欧美在线中文| www.日逼| 黄页网站免费在线观看| 日本一区二区三区四区| 亚洲电影在线| 18禁www| gogogo免费高清在线偷拍 | 亚洲自拍中文字幕| 五月天久久久| 天天干天天日蜜臀色欲av| 国产又粗又长视频|