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

Lottie動畫雙狀態切換的漸進式優化實踐

開發 前端
每次狀態切換時,都會移除當前的?animationView,重新創建一個新的?LottieAnimationView?實例,并加載對應的動畫資源;這種方式不僅會導致主線程卡頓,還會頻繁地創建和銷毀視圖對象,進一步增加性能開銷。

引言

在移動應用中,雙狀態動畫切換是最常見的交互模式之一:

  • TabBar圖標的聚焦/失焦狀態
  • 按鈕的選中/未選中狀態
  • 開關的開啟/關閉狀態

當使用Lottie實現這類需求時,傳統方案面臨兩大痛點:

  • 啟動阻塞:同步加載動畫資源導致主線程卡頓
  • 切換卡頓:狀態變化時重復解析JSON文件

本文將揭示如何通過三次漸進式優化,構建高性能的雙狀態動畫解決方案。

1.第一階段:基礎方案(同步阻塞模式)

原始實現方案

在初始實現中,我們直接在主線程同步加載動畫資源。以下是代碼實現:

class DualStateLottieView: UIView {
    privatevar animationView: LottieAnimationView!
    
    init(activePath: String, inactivePath: String) {
        // 同步加載失焦狀態動畫(阻塞主線程)
        animationView = LottieAnimationView(filePath: inactivePath)
        super.init(frame: .zero)
        addSubview(animationView)
    }
    
    func setActive(_ isActive: Bool) {
        let path = isActive ? activePath : inactivePath
        
        // 每次切換都重新加載(性能黑洞!)
        animationView.removeFromSuperview()
        animationView = LottieAnimationView(filePath: path)
        addSubview(animationView)
        animationView.play()
    }
}
  • 初始化動畫視圖:在 init 方法中,我們直接通過 LottieAnimationView(filePath:) 同步加載失焦狀態的動畫資源;這種方式會阻塞主線程,直到動畫資源加載完成。如果資源較大或網絡延遲,會導致明顯的卡頓。
  • 狀態切換邏輯:在 setActive(_:) 方法中,根據傳入的布爾值 isActive,選擇對應的動畫路徑;每次狀態切換時,都會移除當前的 animationView,重新創建一個新的 LottieAnimationView 實例,并加載對應的動畫資源;

這種方式不僅會導致主線程卡頓,還會頻繁地創建和銷毀視圖對象,進一步增加性能開銷。

執行流程分析

以下是狀態切換的執行流程圖:

圖片圖片

性能瓶頸分析

圖片圖片

通過分析可以得出以下幾點性能瓶頸:

  1. 主線程阻塞:在初始化和狀態切換時,LottieAnimationView(filePath:) 的調用會同步加載動畫資源,這會阻塞主線程;如果動畫資源較大或加載路徑較慢(如從網絡加載),會導致明顯的卡頓。
  2. 重復解析 JSON 文件:每次狀態切換時,都會重新加載和解析 JSON 文件。這不僅增加了 I/O 開銷,還導致了不必要的重復計算。
  3. 資源加載與視圖渲染強耦合:動畫資源的加載和視圖的渲染緊密耦合,導致每次狀態切換都需要重新加載資源并重新渲染視圖;這種方式在高頻操作時會導致性能急劇下降,用戶體驗極差。

核心缺陷:資源加載與視圖渲染強耦合,導致高頻操作時性能急劇下降

2.第二階段:異步加載與緩存(性能優化)

架構改造方案

為了優化性能,我們對代碼進行了架構改造,引入了異步加載和緩存機制。以下是改造后的代碼實現:

class DualStateLottieView: UIView {
    // 動畫數據緩存
    privatevar activeAnimation: LottieAnimation?
    privatevar inactiveAnimation: LottieAnimation?
    
    // 視圖實例
    privatelet animationView = LottieAnimationView()
    
    func loadResources() {
        // 異步加載主動畫
        DispatchQueue.global().async {
            let anim = LottieAnimation.filepath(activePath)
            DispatchQueue.main.async {
                self.activeAnimation = anim
            }
        }
        
        // 異步加載被動畫...
    }
    
    func setActive(_ isActive: Bool) {
        animationView.animation = isActive ? activeAnimation : inactiveAnimation
        animationView.play()
    }
}
  • 動畫數據緩存:引入了兩個變量 activeAnimation 和 inactiveAnimation,分別用于緩存主動畫和被動畫的數據;這樣可以避免每次狀態切換時重新加載和解析動畫資源。
  • 異步加載資源:在 init 方法中,使用 DispatchQueue.global().async 在后臺線程中加載動畫資源;加載完成后,通過 DispatchQueue.main.async 將動畫數據更新到主線程的緩存變量中;這種方式將文件 I/O 和 JSON 解析操作移出主線程,避免了主線程的阻塞。
  • 狀態切換邏輯:在 setActive(_:) 方法中,直接從緩存中獲取對應的動畫數據,并設置給 animationView;這樣可以快速切換動畫狀態,而無需重新加載資源。

性能優化點

  • 主線程零阻塞:初始化時僅創建輕量級的 animationView 容器視圖,耗時小于 1ms,不會阻塞主線程;動畫資源的加載和解析都在后臺線程完成,不會影響主線程的響應速度。
  • 資源異步加載:通過后臺線程加載動畫資源,避免了主線程的 I/O 操作和 JSON 解析,顯著提升了性能。
  • 動畫數據復用:使用 LottieAnimation 對象緩存動畫數據,避免了重復解析 JSON 文件,減少了不必要的計算開銷。

但是這種方案并不完善,產生了新的問題。

新問題浮現

盡管引入了異步加載和緩存機制,但在測試中發現了一個新問題:

測試發現:快速切換時出現狀態丟失,動畫不響應,這是為什么呢?——狀態切換失敗:

  • 當用戶快速切換狀態時,可能會出現動畫數據尚未加載完成的情況;
  • 例如,用戶調用 setActive(true) 時,activeAnimation 可能還沒有加載完成,導致 animationView.animation 被設置為 nil,動畫無法正常播放。

通過引入異步加載和緩存機制,我們顯著提升了動畫切換的性能,消除了主線程的阻塞問題。然而,快速切換時的狀態丟失問題仍然需要進一步優化。下一階段將通過狀態機和 Pending 機制來解決這一問題。

3.第三階段:狀態機與Pending機制(健壯性增強)

狀態機設計

為了處理動畫加載和狀態切換的時序問題,我們引入了狀態機和Pending機制。以下是狀態機的設計:

enum AnimationState {
    case active
    case inactive
    case pendingActive  // 新增中間狀態
    case pendingInactive
}

private var currentState: AnimationState = .inactive
  1. 狀態定義:active:當前顯示主動畫;inactive:當前顯示被動畫;pendingActive:正在加載主動畫,但尚未完成;pendingInactive:正在加載被動畫,但尚未完成。
  2. 狀態管理:通過 currentState 變量記錄當前的狀態,確保狀態切換的邏輯清晰且可控。

Pending機制實現

func setActive(_ isActive: Bool) {
    let targetState: AnimationState = isActive ? .active : .inactive
    
    switch (targetState, activeAnimation, inactiveAnimation) {
    case (.active, let anim?, _):
        play(animation: anim) // 立即執行
    case (.active, nil, _):
        currentState = .pendingActive // 掛起請求
    // 其他狀態處理...
    }
}

// 動畫加載完成回調
privatefunc handleActiveLoaded() {
    ifcase .pendingActive = currentState {
        play(animation: activeAnimation!)
        currentState = .active
    }
}
  • 狀態切換邏輯:在 setActive(_:) 方法中,根據目標狀態和當前緩存的動畫數據,決定是否立即播放動畫或進入掛起狀態;如果目標動畫已經加載完成(activeAnimation 或 inactiveAnimation 不為 nil),則直接播放動畫;如果目標動畫尚未加載完成,則將當前狀態設置為 pendingActive 或 pendingInactive,并等待加載完成。
  • 加載完成回調:在動畫加載完成的回調方法中(handleActiveLoaded() 和 handleInactiveLoaded()),檢查當前狀態是否為掛起狀態;如果是掛起狀態,則立即播放對應的動畫,并將狀態更新為目標狀態。

生命周期兜底

為了確保視圖在掛載時能夠正確處理掛起狀態,我們在 didMoveToWindow 方法中添加了生命周期兜底邏輯:

override func didMoveToWindow() {
    super.didMoveToWindow()
    guard window != nil else { return }
    
    // 檢查并執行掛起操作
    switch currentState {
    case .pendingActive where activeAnimation != nil:
        play(animation: activeAnimation!)
        currentState = .active
    // 其他狀態處理...
    }
}
  • 在 didMoveToWindow 方法中,檢查視圖是否已經掛載到窗口(window != nil);
  • 如果視圖已經掛載,且當前狀態為掛起狀態(pendingActive 或 pendingInactive),則檢查對應的動畫是否已經加載完成;
  • 如果動畫已經加載完成,則立即播放動畫,并將狀態更新為目標狀態。

資源加載流程優化

圖片圖片

通過引入狀態機和Pending機制,我們解決了以下問題:

  • 資源未就緒時的狀態丟失問題:在動畫資源尚未加載完成時,記錄當前狀態為掛起狀態,確保在資源加載完成后能夠正確切換狀態。
  • 確保最終一致性:通過生命周期兜底邏輯,確保視圖在掛載時能夠處理掛起狀態,避免因加載時序問題導致的狀態不一致。

第四階段:多資源管理(生產級方案)

Lottie動畫與圖片

Lottie 的 json 文件分為兩種情況:

  • 純 json 文件,所有資源(包括圖片)都內嵌在 json 里(base64),這種情況下,Lottie 只需要加載 json 文件本身即可,動畫和圖片都能正常顯示;
  • json 文件 + 外部 images 目錄(圖片分離),這種情況下,Lottie 需要能訪問到 json 文件旁邊的 images 目錄,才能正確加載圖片資源。如果找不到圖片,動畫會顯示不出來或圖片部分缺失。

現在的異步加載方式

let animation = LottieAnimation.filepath(path)

這種方式只傳入了 json 文件路徑,沒有告訴 Lottie 去哪里找 images 目錄。

Lottie 的底層實現會嘗試用 json 路徑的同級目錄下的 images 文件夾,但如果你用的是沙盒緩存路徑、或者 images 目錄和 json 不在同一目錄,或者 images 目錄沒有被正確拷貝,Lottie 就找不到圖片,結果動畫就不會被正常顯示出來。

那么如何解決呢?

圖片資源隔離方案

Lottie 支持自定義圖片加載方式,可以用 FilepathImageProvider 指定 images 目錄。

當你切換 animation 屬性時,如果新動畫的圖片資源目錄和上一個動畫不同,必須同步切換 imageProvider,否則會出現圖片丟失或顯示異常。

// 初始化時創建獨立ImageProvider
let activeProvider = FilepathImageProvider(
    filepath: URL(fileURLWithPath: activePath)
        .deletingLastPathComponent()
        .appendingPathComponent("images")
        .path
)

// 狀態切換時同步更新
func play(animation: LottieAnimation, provider: AnimationImageProvider) {
    animationView.imageProvider = provider // 先切換資源
    animationView.animation = animation    // 再切換動畫數據
    animationView.play()
}

完整架構圖

圖片圖片

  • DualStateLottieView:主類,負責管理雙狀態動畫的加載、切換和渲染;包含動畫數據緩存(activeAnimation 和 inactiveAnimation)和圖片資源提供者(activeImageProvider 和 inactiveImageProvider);使用狀態機管理動畫狀態的變化。
  • AnimationLoader:負責異步加載動畫資源;提供 loadAnimation(path:) 方法,返回加載完成的 LottieAnimation 對象。
  • StateMachine:負責處理狀態變化的邏輯;提供 handleStateChange() 方法,確保狀態切換的正確性和一致性。

關鍵優化點總結

優化階段

核心技術

解決問題

異步加載

全局隊列+主線程回調

消除主線程阻塞

狀態機

Pending狀態管理

處理加載時序問題

資源隔離

獨立ImageProvider

解決多資源沖突

生命周期

didMoveToWindow

視圖掛載兜底

性能對比數據

針對同一個Lottie動畫,JOSN大小4KB,含7張1KB-800KB圖片,內存占用0.7MB

啟動耗時測試(ms)

原始方案

最終方案

優化幅度

89.38

2.27

94.8%

狀態切換性能

指標

原始方案

最終方案

優化幅度

首次切換

6.16ms

4.57ms

25%

二次切換

6.91ms

0.04ms

99%

N次切換

6.91ms

0.04ms

99%

內存波動

高頻分配

零分配

100%

結論:99%的主線程阻塞被消除,切換性能大幅提升

最佳實踐指南

1. 資源規范

推薦目錄結構:
├── tab_animations
│   ├── home_active
│   │   ├── active.json
│   │   ├── images/  # 獨立圖片目錄
│   ├── home_inactive
│   │   ├── inactive.json
│   │   └── images/

2. 預加載策略

// 在應用空閑時預加載
func preloadAnimations() {
    let preloadQueue = OperationQueue()
    preloadQueue.qualityOfService = .utility
    
    for path in criticalAnimationPaths {
        preloadQueue.addOperation {
            _ = LottieAnimation.filepath(path) // 觸發緩存
        }
    }
}

3. 降級方案

func safePlay(animation: LottieAnimation?) {
    guardlet anim = animation else {
        showPlaceholder() // 降級為靜態圖片
        return
    }
    
    animationView.animation = anim
    animationView.play { [weakself] success in
        if !success {
            self?.animationView.currentProgress = 1// 顯示最后一幀
        }
    }
}

結語

通過三次關鍵迭代:

  1. 異步解耦:解決主線程阻塞
  2. 狀態補全:處理資源未就緒場景
  3. 資源隔離:保障復雜資源正確性

我們最終實現了:

  • ?? 啟動加速:主線程接近零耗時
  • ?? 切換流暢:60fps穩定運行
  • ?? 通用性強:適配任意雙狀態場景

優化本質在于解耦三個關注點:

  1. 資源加載(異步)
  2. 狀態管理(狀態機)
  3. 視圖渲染(輕量)

在本次實踐中,我們通過一系列漸進式優化,成功解決了 Lottie 動畫雙狀態切換中的性能瓶頸,實現了高性能、高可靠性的動畫交互體驗。

責任編輯:武曉燕 來源: 搜狐技術產品
相關推薦

2024-11-04 16:04:06

2014-12-16 13:51:55

華為eSpace UC統一通信

2010-04-27 13:41:42

云計算

2021-07-16 06:40:19

Argo RollouAnalysis云原生

2023-04-11 07:59:56

Kruise漸進式交付

2022-08-22 10:40:40

Kubernete部署分析運行

2023-09-28 07:34:33

2021-02-02 10:22:48

Web應用程序架構

2021-12-21 11:01:30

自動駕駛數據人工智能

2022-03-24 10:15:39

PingCAPTiDB數據庫

2021-01-13 13:49:29

漸進式網頁應用應用程序開發

2013-01-21 12:48:46

交互設計UI設計產品設計

2021-06-22 10:07:20

漸進式創新顛覆性創新二元方法

2013-09-23 10:00:33

5G4G5G研究

2024-11-20 09:39:56

漸進式遷移云策略云支出

2016-01-05 16:07:17

2011-05-19 09:21:37

互聯網信息化

2021-07-22 09:00:00

SPAPWAWeb

2024-12-25 16:42:18

點贊
收藏

51CTO技術棧公眾號

奇米四色中文综合久久| 日韩经典第一页| 久久最新免费视频| 亚洲欧美强伦一区二区| 亚洲激情视频| 一个色综合导航| 在线播放av中文字幕| 91吃瓜在线观看| 国产午夜精品理论片a级大结局| 国产精品欧美一区二区| 久久人人爽人人爽人人| 免费成人高清在线视频theav| 欧美日韩免费高清一区色橹橹| heyzo高清中文字幕在线| youjizz亚洲| 欧美小视频在线| 尤物一区二区三区| 午夜视频www| 久草这里只有精品视频| 68精品久久久久久欧美| 一级片黄色录像| 精品按摩偷拍| 欧美猛男gaygay网站| 黄色av网址在线播放| 黄av在线播放| 久久久99精品免费观看不卡| 91麻豆蜜桃| 中文字幕一区2区3区| 日韩午夜av| 欧美大尺度在线观看| 成人性视频免费看| 九九综合在线| 亚洲黄在线观看| 伊人精品视频在线观看| 国产综合av| 亚洲国产中文字幕| 欧美少妇一级片| 95在线视频| 国产亚洲精品福利| 久久久精品动漫| 丰满少妇被猛烈进入| 九一九一国产精品| 国产精品久久激情| 色一情一乱一伦| 在线亚洲观看| 97精品在线视频| 日本三级理论片| 欧美激情一区| 欧美精品在线网站| 欧美 日韩 国产 一区二区三区| 成人羞羞视频在线看网址| 亚洲奶大毛多的老太婆| 亚洲AV无码国产精品| 欧美sss在线视频| 亚洲精品国产精品乱码不99按摩 | 91.xxx.高清在线| 久久久久国产一区二区三区四区| 精品无人区一区二区三区| 国产小视频免费观看| 成人性视频免费网站| 国产精品毛片一区视频| 成人精品在线播放| 99视频国产精品| 久久国产精品一区二区三区四区| 亚洲人视频在线观看| 91麻豆国产在线观看| 日本不卡在线播放| 爱久久·www| 国产精品久久久久久久久久久免费看 | 国产a级黄色大片| 羞羞视频在线观看免费| 亚洲国产精品久久久久秋霞影院 | 欧美人动与zoxxxx乱| 性生生活大片免费看视频| 一级欧美视频| 精品国一区二区三区| 亚洲成人av免费在线观看| 亚洲a级精品| 在线视频国产日韩| 51精品免费网站| 亚洲私人影院| 国产999在线观看| 亚洲中文字幕一区二区| 国产麻豆视频一区| 久久精品中文字幕一区二区三区 | 日韩视频免费观看| 久久久国产精品黄毛片| 国产欧美一级| 国产精品自拍偷拍视频| 朝桐光av在线一区二区三区| 成人的网站免费观看| 欧洲高清一区二区| 国产日产一区二区| 婷婷久久综合九色综合绿巨人| 成人羞羞国产免费网站| 国产精久久一区二区| 精品国产a毛片| 亚洲一级片在线播放| 欧美午夜一区二区福利视频| 青草青草久热精品视频在线网站| 怡红院成永久免费人全部视频| 国产999精品久久久久久绿帽| 欧美一区二区三区在线免费观看| av在线官网| 色综合久久88色综合天天| 佐山爱在线视频| 国产欧美一区| 久久久久久久久久婷婷| 波多野结衣一区二区三区在线 | 伊人色**天天综合婷婷| 全亚洲最色的网站在线观看| 国产精品无码久久久久成人app| 91亚洲精品久久久蜜桃网站| 日本特级黄色大片| 久久人体大尺度| 精品国产乱码久久久久久夜甘婷婷| 欧美日韩高清丝袜| 亚洲二区免费| 91久久久久久久| а天堂8中文最新版在线官网| 亚洲香肠在线观看| 涩多多在线观看| 精品国产一区二区三区四区 | 精品一区中文字幕| 日本不卡久久| 在线观看爽视频| 欧美成人精品3d动漫h| 国产一区二区三区四区在线| 国产日韩欧美三区| www.久久爱.cn| 麻豆影视在线观看_| 日本精品一区二区三区高清| 理论片大全免费理伦片| 中文字幕一区二区三区久久网站| 国产精品美女久久久久久免费| 天堂中文在线8| 亚洲成av人片一区二区| 男男受被啪到高潮自述| 91日韩视频| 国产拍精品一二三| 大乳在线免费观看| 在线免费一区三区| 国精产品一区一区三区免费视频| 亚洲青涩在线| 国产伦精品一区二区三区高清版| 亚洲性图自拍| 欧美一区二区三区的| 老熟妇高潮一区二区三区| 久久精品99久久久| 在线观看亚洲视频啊啊啊啊| 久久伊人国产| 日韩亚洲欧美成人| 国产又大又黑又粗| 亚洲视频综合在线| 在线观看中文av| 欧美成人69| 99在线视频免费观看| 日本小视频在线免费观看| 日韩欧美一区在线观看| 久久久久久久久久91| 成人网在线播放| 亚洲 自拍 另类小说综合图区| 日韩中文字幕| 91精品国产高清久久久久久91| 午夜在线观看视频18| 色综合天天综合网国产成人综合天 | 国产亚洲欧洲黄色| 这里只有精品免费视频| 国产精品美女久久久久久| 亚洲免费黄色网| 一区二区三区四区在线观看国产日韩| 亚洲va欧美va国产综合剧情| 欧美亚洲天堂| 亚洲精品永久免费| 中文字幕第一页在线播放| 亚洲三级久久久| 亚洲综合精品伊人久久| 免费成人在线视频网站| 秋霞午夜一区二区三区视频| 国内精品免费午夜毛片| 性xxxx视频播放免费| 在线观看日韩精品| 农村黄色一级片| 99精品视频一区二区三区| 黄色一级免费大片| 久久久久久免费视频| 精品久久sese| 国产欧美自拍| 97精品国产97久久久久久免费| 搞黄视频在线观看| 日韩美女视频一区二区在线观看| 久久草视频在线| 国产精品女人毛片| 欧美xxxxx精品| 蜜臀国产一区二区三区在线播放| 8x8x华人在线| 夜色77av精品影院| 91黄色国产视频| 神马久久资源| 九九视频这里只有精品| 久蕉在线视频| 精品精品国产高清a毛片牛牛| 日本免费精品视频| 亚洲成在线观看| 亚欧精品视频一区二区三区| 成人免费电影视频| 五月天婷婷亚洲| 蜜桃av综合| 国产真人做爰毛片视频直播| 欧美电影一区| 欧美一区观看| 欧美大片网址| 99久久精品无码一区二区毛片 | 天海翼在线视频| 97在线视频免费观看完整版| 亚洲精品99久久久久中文字幕| 在线视频1卡二卡三卡| 狠狠色香婷婷久久亚洲精品| 精品国产精品国产精品| 国产午夜精品久久久久久免费视 | 日韩视频免费在线观看| 日本人妖在线| 欧美r级电影在线观看| 中文字幕观看视频| 欧美午夜视频一区二区| 久久久久无码国产精品不卡| 国产精品久久久久婷婷二区次| 国产国语性生话播放| 粉嫩av一区二区三区| xxxx在线免费观看| 日韩av在线发布| 黄色免费视频大全| 狠狠色丁香久久综合频道| 午夜在线视频免费观看| 日韩理论电影院| 日韩精品久久久| 久久最新网址| 免费在线观看一区二区| 九色丨蝌蚪丨成人| 国产女主播一区二区| 中文字幕日韩高清在线| 99精品在线直播| 日本精品视频| 999久久久| 亚洲一区二区三区中文字幕在线观看 | 天堂精品视频| 成人三级视频| 99re99热| 欧美1级日本1级| 91成人综合网| 亚洲小说欧美另类社区| 日韩成人手机在线| 一区福利视频| 夫妻免费无码v看片| 国产偷自视频区视频一区二区| 久久综合色视频| 亚洲欧美久久久| 国产一区二区视频免费在线观看| 日韩专区一卡二卡| 手机看片一级片| 精品一区二区国语对白| www激情五月| 国v精品久久久网| 亚洲国产综合视频| 国产午夜亚洲精品不卡| 国产精品suv一区二区88| 一色桃子久久精品亚洲| 久久久国产精品人人片| 狠狠色狠色综合曰曰| 中文在线观看av| 日韩一区二区精品葵司在线| 高清毛片aaaaaaaaa片| 国产视频一区在线| 在线观看完整版免费| 久久6免费高清热精品| 极品在线视频| 国产精品一二区| 中文字幕一区日韩精品| 蜜桃av色综合| 亚洲国产精品久久久天堂 | 国产一区二区三区高清视频| 九九热线有精品视频99| 吴梦梦av在线| 午夜亚洲一区| 九九热99视频| 成人午夜av电影| 九九热免费在线| 亚洲综合免费观看高清在线观看| 亚洲自拍一区在线观看| 欧美美女一区二区| 色综合免费视频| 日韩天堂在线视频| 欧美在线极品| 成人综合网网址| 免费一区二区三区视频导航| 福利网在线观看| 久久xxxx| 毛毛毛毛毛毛毛片123| 久久亚洲春色中文字幕久久久| 日本黄色片免费观看| 黑人巨大精品欧美一区二区三区| 亚洲一区中文字幕在线| 日韩成人激情视频| 1区2区在线观看| 国产精品福利小视频| 久久精品国产亚洲5555| 天天干天天操天天干天天操| 久久精品导航| 国产51自产区| 最好看的中文字幕久久| 无码免费一区二区三区| 亚洲国产精品成人va在线观看| 国产一二三区在线观看| 国产精品嫩草影院一区二区| 欧美激情极品| av动漫在线免费观看| 精品亚洲欧美一区| 国产在线综合视频| 狠狠色噜噜狠狠狠狠97| 黄色av中文字幕| 久久视频这里只有精品| 香蕉成人影院| 欧美极品色图| 99国产精品久久久久久久成人热| 两女双腿交缠激烈磨豆腐| 中文字幕中文字幕一区二区| 波多野结衣视频网址| 亚洲欧美在线免费| 在线天堂资源| 久久99九九| 国产欧美一区二区三区国产幕精品| wwwxxxx在线观看| 亚洲欧美国产77777| 一区二区三区黄色片| 中文字幕9999| 91大神在线观看线路一区| 日韩av影视| 老**午夜毛片一区二区三区| 亚洲第一成人网站| 欧美性xxxx18| 四虎电影院在线观看| 8x海外华人永久免费日韩内陆视频| 丁香婷婷成人| 阿v天堂2017| 久久综合久久99| 国产精品国产三级国产专区52| 亚洲精品xxxx| 九色porny自拍视频在线观看| 国产午夜精品一区| 国产视频一区在线观看一区免费| 好吊一区二区三区视频| 精品国产91久久久| 深夜福利视频一区| 国产精欧美一区二区三区| 精品国产一区二区三区av片| 狠狠躁狠狠躁视频专区| 国产精品久久久久久久久晋中| 国产精品午夜福利| 欧美日本高清视频| 6080亚洲理论片在线观看| 国产免费黄色一级片| 久久新电视剧免费观看| 中文有码在线播放| 久久国产精品视频| 77成人影视| 国产精品第12页| 国产精品不卡视频| 丰满人妻一区二区| 日韩av不卡在线| 91亚洲国产| 佐佐木明希电影| 欧美午夜无遮挡| 麻豆视频免费在线观看| 国产精品xxxx| 丝袜诱惑制服诱惑色一区在线观看| 国产精品情侣呻吟对白视频| 91精品国产综合久久精品| 丁香花在线影院| 欧洲一区二区在线观看| 加勒比av一区二区| 日本熟妇一区二区| 最近2019中文字幕第三页视频| 粉嫩一区二区三区在线观看| 男人添女荫道口图片| 国产欧美综合在线观看第十页 | 成人影院大全| 亚洲综合欧美日韩| 成年人网站91| 亚洲专区第一页| 性欧美亚洲xxxx乳在线观看| 精品色999| 人妻av一区二区| 欧美日韩一卡二卡| 久久青草伊人| 国产精品夜夜夜爽张柏芝| 26uuu色噜噜精品一区| 国产精品久久欧美久久一区| 91超碰caoporn97人人| 亚洲在线久久| 国产精品高清无码在线观看|