精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费国产黄色网址| 高清国语自产拍免费一区二区三区| aaaaa级少妇高潮大片免费看| 性感女国产在线| 欧美国产精品劲爆| 91嫩草免费看| 天天爽夜夜爽人人爽| 国产高清一区| 日韩av在线免费播放| 日本888xxxx| 超级碰碰不卡在线视频| www国产成人| 91免费高清视频| 超碰超碰超碰超碰| 欧美成人精品| 亚洲性无码av在线| 女性生殖扒开酷刑vk| 成人在线观看免费播放| 亚洲国产精品久久久久婷婷884 | 国产一级片av| 亚洲女同中文字幕| 亚洲视频一区二区| 秘密基地免费观看完整版中文 | 国产亚洲精品久久飘花| 五月婷婷丁香在线| 国产欧美另类| 草民午夜欧美限制a级福利片| 手机av免费看| 久久99国产精品久久99大师| 91麻豆精品国产| 九九热在线免费| 性欧美18xxxhd| 亚洲一卡二卡三卡四卡无卡久久 | 影音先锋日韩资源| 爱福利视频一区| a级大片在线观看| 国产欧美自拍一区| 精品日产卡一卡二卡麻豆| 日本人69视频| 成人全视频免费观看在线看| 欧美日韩一区二区在线| 国内少妇毛片视频| 怡红院红怡院欧美aⅴ怡春院| 国产精品天天看| 免费h精品视频在线播放| 手机看片福利在线| 9人人澡人人爽人人精品| 成人av免费看| 午夜美女福利视频| 国产一区二区三区免费看| 国产欧美婷婷中文| 97人妻精品一区二区三区动漫| 日韩精品欧美成人高清一区二区| 日本高清视频精品| 亚洲 欧美 日韩 在线| 国产精品女主播一区二区三区| 国内精品400部情侣激情| 黄页网站免费观看| 国内精品99| 久久久久久国产精品| 久久久久亚洲av片无码下载蜜桃| 欧美久久成人| 国语自产精品视频在线看抢先版图片| 久久精品国产亚洲av高清色欲| 狠狠色丁香久久综合频道| 欧美激情va永久在线播放| 四虎永久在线精品| 夜夜精品视频| 国产精品狠色婷| 国产精品久久免费| 国产大陆精品国产| 精品国产乱码久久久久久蜜柚 | 久久久久久久久久久久久久久99 | 亚洲国内欧美| 欧美一区二区色| 天堂免费在线视频| 精品一区二区三区的国产在线播放| 成人夜晚看av| 天堂在线观看免费视频| 久久综合九色综合欧美98 | 欧美精品日本| 欧美中文在线观看| 91av久久久| 国产成人无遮挡在线视频| 国产一区二区三区四区五区在线| 亚洲欧美一区二区三| 国产人伦精品一区二区| 一区二区视频在线观看| 欧美亚洲系列| 日本黄色一区二区| 一区二区久久精品| 日韩一区免费视频| 午夜av免费观看| 成人综合婷婷国产精品久久| 精品免费二区三区三区高中清不卡| 欧美视频免费一区二区三区| 日本一区二区免费在线| 亚洲黄色网址在线观看| a级片在线免费观看| 欧美在线视频日韩| 一起草最新网址| 精品一区免费| 欧美日本高清一区| 波多野结衣啪啪| 国产乱一区二区| 欧美第一黄网| 久久综合之合合综合久久| 午夜精品视频在线观看| 国产高潮免费视频| 成人免费直播在线| 中文字幕日韩专区| 国产精品7777| 麻豆精品新av中文字幕| 国产精品一区二区三区观看| aaa日本高清在线播放免费观看| 尤物在线观看一区| 91香蕉视频污版| 欧美色图五月天| 久久国产精品电影| 精品无码一区二区三区的天堂| 国产麻豆精品在线观看| 欧美日韩精品免费在线观看视频| 操你啦视频在线| 色婷婷av一区二区三区gif| 色哟哟在线观看视频| 国内黄色精品| 性色av香蕉一区二区| 国产一区二区麻豆| 国产日韩欧美精品一区| 丁香花在线影院观看在线播放 | 国产精品电影一区| 国产91久久久| 亚洲欧美日韩久久| 亚洲欧美久久久久| 你懂的一区二区三区| 韩国19禁主播vip福利视频| 91theporn国产在线观看| 国产偷国产偷精品高清尤物| 欧美国产激情视频| 国产精品任我爽爆在线播放| 久久中文字幕在线| 一区二区www| 国产精品天干天干在观线| 日韩中文字幕二区| 国产91一区| 欧美性视频网站| 三级视频网站在线| 午夜精品久久久久久久99樱桃| 国产伦精品一区二区三区妓女下载| 欧美电影免费播放| 国产精品在线看| h网站在线免费观看| 欧美亚一区二区| 91麻豆精品国产91久久综合| 天堂影院一区二区| 日本最新一区二区三区视频观看| 伊伊综合在线| 亚洲视频视频在线| 亚洲系列在线观看| 综合在线观看色| 深爱五月综合网| 欧美在线黄色| 国产一区二区免费电影| 成人性生交大片免费网站| 亚洲欧美中文另类| 免费视频网站在线观看入口| 日本一区二区免费在线| 亚洲欧美天堂在线| 国产一区美女| 久久久水蜜桃| 超薄肉色丝袜脚交一区二区| 日韩在线观看av| 国产av无码专区亚洲av| 亚洲综合在线观看视频| 中文字幕一区三区久久女搜查官| 伊人久久大香线蕉综合热线| 久久久久网址| 欧美风情在线视频| 欧美老女人xx| 欧美男男激情freegay| 欧美中文字幕亚洲一区二区va在线| 大地资源高清在线视频观看| 国产99一区视频免费| 六月丁香婷婷激情| 超碰成人久久| 99精品国产高清一区二区| 在线天堂资源| 久久精品国产2020观看福利| 男人天堂一区二区| 在线国产亚洲欧美| 欧美高清视频一区二区三区| 91丨九色丨国产丨porny| 九色91popny| 欧美激情综合| 欧美日韩无遮挡| 日韩精品一区二区三区中文在线 | 成人豆花视频| 欧美极品在线播放| 北岛玲一区二区三区| 日韩欧美色综合网站| 国产精品777777| 一区二区在线免费| 免费黄色片网站| 高清国产一区二区| 99sesese| 国产手机视频一区二区| 日韩 欧美 自拍| 免费一区二区三区视频导航| 97中文在线观看| 精品视频一区二区三区四区五区| 亚洲**2019国产| 超碰公开在线| 中文字幕av一区二区| 手机看片福利在线| 日韩欧美中文字幕精品| 精品国产www| 欧美日韩一区二区三区在线免费观看| 国产真实乱在线更新| 国产日产欧美一区| 日韩Av无码精品| 国产精品中文字幕一区二区三区| 国产又猛又黄的视频| 夜夜嗨网站十八久久| 欧美一级特黄aaaaaa在线看片| 岳的好大精品一区二区三区| 成人欧美一区二区| 亚洲一区二区av| 国产精品第一区| 成人影院入口| 欧美在线欧美在线| 国产网站在线| 高清视频欧美一级| 曰本三级在线| 久久成人18免费网站| 免费在线你懂的| 中文字幕一区日韩电影| 国产爆初菊在线观看免费视频网站| 国产视频精品久久久| 手机在线精品视频| 精品成人私密视频| 黄色美女一级片| 精品久久五月天| 午夜久久久久久久久久| 日韩一级黄色大片| 亚洲AV午夜精品| 日韩午夜电影av| 99精品在线视频观看| 91精品国产综合久久精品| 91亚洲精品国偷拍自产在线观看| 欧美特级限制片免费在线观看| www.久久视频| 欧美天堂亚洲电影院在线播放| 中文字幕在线播放日韩| 欧美日韩国产高清一区二区三区 | av电影一区二区| 亚洲视频 中文字幕| 懂色av一区二区三区蜜臀| 国产又粗又猛大又黄又爽| 国产成人午夜精品影院观看视频 | 98精品久久久久久久| 亚洲一区二区三区精品视频| 久久一区二区三区喷水| 一区二区三区在线视频看| 亚洲最新av| 97碰在线视频| 亚洲神马久久| 成年网站在线播放| 国内成+人亚洲+欧美+综合在线| 国产不卡的av| 国产69精品久久久久毛片| 精人妻一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 青青草福利视频| 中文字幕在线观看不卡| 加勒比av在线播放| 欧美日韩亚洲视频一区| 中文字幕第三页| 日韩精品中午字幕| 欧美成熟毛茸茸| www.亚洲男人天堂| 久久免费电影| 日本中文字幕不卡免费| 在线免费观看亚洲| 国产欧美日韩一区二区三区| 久操成人av| 一级黄色免费在线观看| 亚洲经典在线| 狠狠干狠狠操视频| 不卡高清视频专区| 无码人中文字幕| 亚洲国产中文字幕在线视频综合| 中文字幕一区在线播放| 欧美精品久久天天躁| 天天操天天射天天舔| 在线看国产精品| xxx.xxx欧美| 91精品国产综合久久久久久蜜臀| 懂色av一区二区| 亚洲春色在线视频| 亚洲激情网站| av在线免费看片| 久久综合九色欧美综合狠狠| 小泽玛利亚一区二区免费| 欧美日韩在线另类| 国产高中女学生第一次| 一区二区三区无码高清视频| 国内高清免费在线视频| 国产精品最新在线观看| 凹凸av导航大全精品| 中文字幕av日韩精品| 亚洲一区日本| 欧美国产日韩在线视频| 日本一区二区免费在线| 国产精品久久久久久99| 欧美一级高清片| www日韩tube| 日本欧美黄网站| 卡通动漫国产精品| 中国一级黄色录像| 蜜臀精品一区二区三区在线观看| 亚洲人人夜夜澡人人爽| 亚洲www啪成人一区二区麻豆| 国产又色又爽又黄又免费| 亚洲欧美国产一区二区三区 | 国产精品黄页免费高清在线观看| 黄色免费大全亚洲| 欧美久久久久久久久久久久久久| 极品少妇xxxx偷拍精品少妇| 日韩女同一区二区三区 | 秋霞影视一区二区三区| 亚洲高潮无码久久| 久久成人羞羞网站| 免费在线观看a视频| 在线视频一区二区三区| 日本韩国一区| 1769国产精品| 人体久久天天| 久色视频在线播放| 成人国产视频在线观看| 久久久久免费看| 日韩欧美精品在线视频| 伊人福利在线| 91手机在线播放| 一区二区三区四区日韩| 国产永久免费网站| 国产精品免费aⅴ片在线观看| 夜夜躁日日躁狠狠久久av| 国产亚洲欧洲黄色| 欧美无毛视频| 日本黑人久久| 日韩影院精彩在线| 日韩毛片无码永久免费看| 色婷婷激情一区二区三区| 国产有码在线| 国产精品成久久久久三级| 日韩av在线播放网址| 欧美午夜性生活| 国产精品国产精品国产专区不片| 在线观看毛片网站| 中文字幕在线视频日韩| 六九午夜精品视频| 熟女视频一区二区三区| 国产高清在线精品| 日本黄色片视频| 亚洲欧美日本精品| 国语自产精品视频在线看抢先版结局| 五月天亚洲综合小说网| 韩国三级中文字幕hd久久精品| 四虎884aa成人精品| 精品播放一区二区| 在线中文字幕播放| 亚洲精品一区二| 国产成人av福利| 好看的av在线| 中文字幕国产亚洲| 国产一区一区| 免费国产黄色网址| 亚洲国产成人午夜在线一区| 国产免费av观看| 97av在线播放| 久久电影院7| 逼特逼视频在线观看| 色综合中文字幕国产| 日本福利在线| 国产乱码精品一区二区三区中文 | 国产欧美日韩91| 午夜精品国产| mm131丰满少妇人体欣赏图| 欧美精品久久久久久久久老牛影院| 性欧美猛交videos| 日本中文不卡| 岛国一区二区三区| 亚洲国产精品无码久久久| 久久国产精品首页| 免费视频一区三区| 麻豆短视频在线观看| 在线观看成人免费视频| 999精品网| 亚洲最新在线| 久久综合久久综合久久综合|