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

調試性能的Adobe AIR應用程序

移動開發
應用程序性能是長期的。這是與生俱來的。為了確保一個應用程序性能良好,每個部分都必須性能良好。某個部分出現失誤就會拖累整個應用程序。編寫一個大型應用程序時作者偶爾也會放松警惕。

性能相關問題往往表明作者無法理解問題鏈中最薄弱的環節。以下是我最喜歡提到的一些有關性能和 AIR 應用程序的糟糕提問:

  • 我的 AIR 應用程序會運行如飛嗎?
  • AIR 是否可以達到執行 X 的速度?
  • AIR 執行 Y 是否太慢?

(以下內容還證明了一點,無論幼稚園老師教了您什么,總會出現糟糕提問這類事物。)

AIR 幾乎總可以通過應用程序實現良好性能。而另一方面,AIR 無法為您這樣做。正如我所說的,這是問題的本性。

幸運的是,標準調試技術像適用于編寫桌面軟件一樣適用于 AIR。

合適的提問

實現良好性能的***步,就如同大多數設計問題,在于理解您嘗試解決的問題。以下是一些針對您的應用程序的合適的提問:

  • 我的應用程序中哪些操作對于性能比較敏感?
  • 我可以使用什么衡量標準來測量這一敏感度?
  • 如何優化應用程序以達到這一衡量標準?

大多數應用程序包含大量可以穩定運行的代碼。不要在這方面浪費時間,尤其是當益處低于用戶可以察覺的閾值時。務必將注意力集中在重要方面。

值得優化的常見操作示例包括:

  • 圖像、聲音和視頻處理
  • 渲染大型數據集或 3D 模型
  • 搜索
  • 響應用戶輸入

定義衡量標準

人們往往將性能和速度劃上等號,但千萬不要誤以為這是唯一重要的衡量標準。您可能發現需要針對內存使用或電池壽命進行調試。將這些降至***的應用程序也可以被認為比那些不降低的應用程序性能更高。有時優化其他衡量標準也可以提高速度,但其他時候需要做出折衷。

無論測量什么,您必須測量一些對象。如果不測量任何對象,您就無法得知更改是有利于還是有害于性能。良好的衡量標準有以下三個特性:

  • 它們可以量化。可以測量它們并記錄為數字。
  • 它們是一致的。您可以反復測量它們,并有效地比較測量結果。
  • 它們有意義。測量值中的變化對應于您正在優化的對象。

為了使它更形象,假設您正在編寫一個應用程序,它將對一個大型圖像集執行一些圖像處理任務。在處理過程中,應用程序需要向用戶顯示進度反饋。它還必須允許用戶能取消操作,而不是等待操作完成。這是一個十分簡單的應用程序,但即便如此,它至少仍有三個重要的衡量標準可供審視。

示例:吞吐量

***個、最顯而易見的衡量標準是吞吐量。它在這個示例中是有意義的,因為我們知道自己必須處理大量圖像。吞吐量越高,處理完成得越快。

吞吐量可以輕松量化為每單位時間的處理量。盡管可以測量已處理圖像的數量,但當圖像大小不一時,測量字節數可以產生一致性更高的值。在這個示例中,直接測量每毫秒字節數作為吞吐量。

示例:內存使用

對于這個應用程序,一個不太顯眼的衡量標準是內存使用。對于最終用戶,內存使用不像吞吐量那樣顯而易見。為了監視內存使用,用戶必須運行另一個應用程序,如 Activity Monitor。但內存使用可能成為一個限制因素:內存不足,此時應用程序將無法正常運行。

內存使用對于我們的圖像處理示例是重要的,因為這些圖像本身很大。我們希望能處理大型圖像-即便是那些超出可用 RAM 的圖像-前提是不出現內存不足的情況。內存使用按字節測量很簡單。

示例:響應時間

我們的范例應用程序的***一個衡量標準往往被忽略:用戶輸入的響應時間。這個衡量標準對于您的所有用戶而言都是顯而易見的,雖然他們很少停下來測量它。它也十分普遍。用戶希望所有操作都能得到快速響應-無論是調整窗口大小、取消某個操作還是鍵入文本。

用戶認為某些衡量標準是線性的,而響應時間卻有一個重要的閾值。輸入響應只要超過 100 毫秒左右,用戶就會有慢的感覺。如果您的應用程序響應速度始終低于這個閾值,就沒有進一步優化的必要了。顯然,這個衡量標準可以按毫秒輕松量化。

響應時間對于圖像處理應用程序是一個重要挑戰,因為處理任何一張圖像的時間都遠遠超出 100 毫秒。在某些編程環境中,通過在連續計算線程以外的線程上處理用戶輸入來解決這個問題。而在內部,這種解決方法需要操作系統快速切換線程環境,確保用戶輸入線程可以及時響應。但 AIR 不提供明確的線程模型,所以必須直接完成這一切換操作。下一部分將說明這一操作。以下范例說明了設置圖像處理的三種不同方式,它們針對不同的衡量標準而優化:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.             <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" frameRate='45'> 
  3.   <mx:Script> 
  4.   <![CDATA[ 
  5.             private static const DATASET_SIZE_MB:int = 100; 
  6.    
  7.             private function doThroughput():void { 
  8.             var start:Number = new Date().time; 
  9.             var data:ByteArray = new ByteArray(); 
  10.             data.length = DATASET_SIZE_MB * 1024 * 1024; 
  11.             filter( data ); 
  12.             var end:Number = new Date().time; 
  13.             _throughputLabel.text = ( data.length / ( end - start )) + " bytes/msec"; 
  14.             } 
  15.    
  16.             private function doMemory():void { 
  17.             var start:Number = new Date().time; 
  18.             var data:ByteArray = new ByteArray(); 
  19.             data.length = 1024 * 1024; 
  20.             for( var chunk:int = 0; chunk < DATASET_SIZE_MB; chunk++ ) { 
  21.             filter( data ); 
  22.             } 
  23.             var end:Number = new Date().time; 
  24.             _memoryLabel.text = ( DATASET_SIZE_MB * data.length / ( end - start )) + " bytes/msec"; 
  25.             } 
  26.    
  27.             private function doResponse():void { 
  28.             _chunkStart = new Date().time; 
  29.             _chunkData = new ByteArray(); 
  30.             _chunkData.length = 100 * 1024; 
  31.             _chunksRemaining = DATASET_SIZE_MB * 1024 / 100;  
  32.             _chunkTimer = new Timer( 1, 1 ); 
  33.             _chunkTimer.addEventListener( TimerEvent.TIMER_COMPLETE, doChunk ); 
  34.             _chunkTimer.start(); 
  35.             } 
  36.    
  37.             private function doChunk( event:TimerEvent ):void { 
  38.             var iterStart:Number = new Date().time; 
  39.             while( _chunksRemaining > 0 ) { 
  40.             filter( _chunkData ); 
  41.             _chunksRemaining--; 
  42.  
  43.             var now:Number = new Date().time; 
  44.             if( now - iterStart > 90 ) break; 
  45.             } 
  46.    
  47.             if( _chunksRemaining > 0 ) { 
  48.             _chunkTimer.start(); 
  49.             } else { 
  50.             var end:Number = new Date().time; 
  51.             _responseLabel.text = ( DATASET_SIZE_MB * 1024 * 1024 / ( end - _chunkStart )) + " bytes/msec";  
  52.             } 
  53.             } 
  54.    
  55.             private var _chunkStart:Number; 
  56.             private var _chunkData:ByteArray; 
  57.             private var _chunksRemaining:int; 
  58.             private var _chunkTimer:Timer; 
  59.    
  60.             private function filter( data:ByteArray ):void { 
  61.             for( var i:int = 0; i < data.length; i++ ) { 
  62.             data[i] = data[i] * data[i] + 2; 
  63.             } 
  64.             } 
  65.             private function onMouseMove( event:MouseEvent ):void { 
  66.             var global:Point = new Point( event.stageX, event.stageY ); 
  67.             var local:Point = _canvas.globalToLocal( global ); 
  68.             _button.x = local.x; 
  69.             _button.y = local.y; 
  70.             } 
  71.    
  72.             ]]> 
  73.   </mx:Script> 
  74.    
  75.   <mx:HBox width='100%' height='100%'> 
  76.   <mx:VBox width='50%' height='100%'> 
  77.   <mx:Button label='Measure throughput' click='doThroughput();' /> 
  78.   <mx:Label  id='_throughputLabel' /> 
  79.   <mx:Button label='Reduce memory use' click='doMemory();' /> 
  80.   <mx:Label  id='_memoryLabel' /> 
  81.   <mx:Button label='Maintain responsiveness' click='doResponse();' /> 
  82.   <mx:Label  id='_responseLabel' /> 
  83.   </mx:VBox> 
  84.   <mx:Canvas  
  85.             width='50%' height='100%' 
  86.             id="_canvas"  
  87.             horizontalScrollPolicy="off" 
  88.             verticalScrollPolicy="off" 
  89.             backgroundColor="white" 
  90.             mouseMove='onMouseMove( event );' 
  91.   > 
  92.   <mx:Label text="Move Me" id="_button" /> 
  93.   </mx:Canvas> 
  94.   </mx:HBox> 
  95.   </mx:WindowedApplication> 

進行測量

當確定并定義衡量標準后,您首先必須能測量它們,隨后才能處理它們。只有通過前后兩次的測量和跟蹤,您才能確定那些變化的影響。盡可能同時跟蹤所有衡量標準,這樣可以了解為優化一個衡量標準所做的更改對其他衡量標準產生的影響。

測量吞吐量

可以通過程序輕松測量吞吐量。測量吞吐量的基本模式為:

  1. start_msec = new Date().time 
  2. do_work() 
  3. end_msec = new Date().time 
  4. rate = bytes_processed / ( end_msec - start_msec )  

測量內存

內存更復雜一些。包括 AIR 在內的大多數運行時環境不提供可以確定應用程序內存使用的適當 API。***使用外部工具監視內存使用,如 Activity Monitor (Mac OS X)、任務管理器 (Windows)、BigTop (Mac OS X) 等。選擇一個監視工具后,您需要決定要跟蹤哪個內存衡量標準。

虛擬內存是跟蹤工具的頭號報告對象。 人如其名,它不會測量進程使用的物理 RAM 量。可以將它想象為進程使用的內存地址空間量。在某個時刻,分配給進程的一部分內存通常會存儲在磁盤而不是 RAM 中。人們通常認為 RAM 量以及占用的磁盤空間之和就是進程的虛擬內存,但地址空間的某些部分可能不在這兩個地方。具體情況取決于操作系統以及它根據不同目的分配虛擬內存部分的方式。

根據虛擬內存包含的內容,應用程序虛擬內存的絕對大小可能不是一個重要的衡量標準。您的應用程序相對于其他類似應用程序的虛擬內存可能是重要的,但依然很難進行有效比較。虛擬內存最重要的一個方面是它隨著時間流逝產生的行為:無限增長表明存在內存泄漏。其他內存衡量標準中可能不顯示內存泄漏,因為如果未引用泄漏的內存,它們會調入磁盤并駐留在那里。

可供監視的***內存衡量標準是專用字節,它測量進程單獨使用的 RAM 量。這個衡量標準直接表明您的應用程序對整個系統產生的影響,它使用的是共享資源。

專用字節會隨著應用程序分配和取消分配內存而波動。它也會隨著應用程序活動或空閑而波動,空閑時部分頁面會調入磁盤。要跟蹤專用字節,我建議在您優化的操作過程中使用監視工具進行定期采樣,即每秒一次。

監視工具包含的其他內存衡量標準包括駐留大小和共享字節。駐留大小是您的進程所使用的 RAM 總量,它由專用字節和共享字節組成。共享字節是與其他進程共享的 RAM 部分。這些部分通常包含只讀資源,如共享庫或系統框架中的代碼。雖然您可以跟蹤這些衡量指標,應用程序目前對專用字節值的控制度***,問題也最多。

響應時間

響應時間***用秒表測量。當用戶執行操作時開始計時,如單擊按鈕時。當應用程序響應時停止計時,通常更改顯示的用戶界面即可。將兩個計時相減就可以得出測量值。

優化流程

有了目標和衡量標準,就可以進行優化了。流程本身很簡單,并且應當很常見。重復以下三個步驟,直至完成:

  1. 測量
  2. 分析
  3. 修改

大致而言,分析可能產生兩種更改中的一種:設計或代碼。

設計更改

設計更改通常影響***。但是,在游戲后期進行設計更改難度可能更大,所以定義并測量性能目標之前不要耽擱太久。

例如,我們回到圖像處理應用程序。一種單純的實施方法是:將每個圖像完整加載到內存中,處理它,然后將結果寫回磁盤。這個應用程序的內存使用峰值(專用字節)主要就是已加載圖像大小的函數。如果圖像超出可用 RAM,應用程序將失敗。

圖像處理操作很少是全局的;大多數操作每次可以在圖像的某個部分上執行。通過將圖像分為固定大小的多個塊并且逐個處理這些塊,您可以將應用程序的內存使用峰值限制為選定的數值。這樣,處理超出可用 RAM 的圖像也成為可能。

修改設計后,請務必重新評估所有衡量標準。它們之間始終會出現一些相互作用,因為設計發生了變化。那些更改有時可能會出乎想象。當我構建這個范例應用程序的原型時,按固定大小的塊處理圖像并未大幅改變應用程序的吞吐量,我預計它可能變慢。

代碼更改

當不再需要增強設計時,可轉向代碼調試。這個方面可以嘗試許多技術。其中有些是 ActionScript 特有的;有些則不然。

切記不要過早應用代碼更改。它們可能會犧牲可讀性和性能結構。雖然不一定每次都會很糟,但是如果過早應用代碼更改,它們會降低您改進和維護應用程序的能力。正如 Donald Knuth 所說,“過早的優化是一切罪惡的源頭。”

特制的測試應用程序

真實的應用程序往往較大、較復雜并且滿是快速運行的代碼。為了幫助您既愛那個優化精力集中在主要操作上,可考慮創建一個專用測試應用程序。

除了其他優勢,測試應用程序提供了一個包含測試的空間(即,用于測量吞吐量),您無需將這個代碼包含在最終的應用程序中。

當然,將您的改進移回應用程序時,您需要驗證優化結果是否依然有效。

分塊

如前所述,AIR 運行時不提供在后臺線程上執行應用程序代碼的機制。在計算密集型任務過程中嘗試保持響應度時,這個問題尤為棘手。

與空間分塊可用于優化內存使用一樣,時間分塊可以將計算分為多個短時運行部分。通過響應各部分之間的用戶輸入,您可以保持應用程序的響應度。

以下偽代碼每次可以執行約 90 毫秒的工作,然后把控制權交給主事件循環。主事件循環確保已處理鼠標單擊等操作。根據這一時間安排,可以在 100 毫秒內處理大多數用戶輸入,從用戶角度而言,應用程序的響應速度已足夠。

  1. var timer:Timer = new Timer( 1, 1 ) 
  2.   timer.addEventListener( TimerEvent.TIMER, doChunk )  
  3.   function doChunk( event:Event ):void { 
  4.     var start:Number = new Date().time 
  5.     while( workRemaining ) { 
  6.       doWork() 
  7.         var now:Number = new Date().time 
  8.         if( now - start > 90 ) { 
  9.           // reschedule more work to occur after input 
  10.         if( workRemaining )  
  11.            timer.start() 
  12.         break 
  13.       }  
  14.     } 
  15.   }  

在此例中,為了保持響應度,doWork() 的運行時間必須遠遠小于塊持續時間。為了保持在 100 毫秒的最糟情況下,運行時間不能超出 10 毫秒。

再次強調,采用這類方法后,請重新測量所有衡量標準。在我的圖像處理應用程序中,采用這種分塊方法后吞吐量下降了約 10%。另一方面,我的應用程序在所有用戶輸入的 100 毫秒內可以做出響應,而不僅僅是在圖像之間。我認為這是一個合理的折衷。

包裝

創建高性能的應用程序并非易事,但要回應嚴格的測量、分析和不斷改進會遇到問題。AIR 應用程序在這個問題上沒有很大區別。

性能同時也是一個不斷變化的目標。不僅每一組改進可能影響到其他衡量標準,底層硬件、操作系統和其他更改也會改變快與慢之間的平衡。即便是您在優化的對象也可能隨時間發生變化。

憑借充分的實戰經驗,您可以創建出高性能的 AIR 應用程序并使它們持之以恒。切記不要放松警惕。只要有一個功能變慢,用戶就會發問,“您的應用程序是否可以達到執行 X 的速度?”

 

關于作者

自 Adobe AIR 誕生并發展出新穎的安裝技術以來,Oliver 一直致力于這個領域。在轉向 AIR 之前,他致力于 Adobe LiveCycle,而在加入 Adobe 之前,他從事的領域很廣,包括金融服務、數字信號處理和視頻游戲。他有時為 Dr. Dobb's Journal 撰稿,并且是 Kidos Computer 技術咨詢委員會的成員。他獲得了斯坦福大學的計算機本科及碩士學位。

 

 

責任編輯:佚名 來源: Adobe
相關推薦

2011-11-17 15:01:37

AdobeAIR移動應用

2011-11-17 15:31:12

AdobeAIR

2012-02-15 13:26:56

IndexedDB

2013-05-14 10:33:57

AIR Android應用程序描述文件

2012-02-28 13:52:45

Adobe AIRAndroidFlash

2022-12-25 18:03:13

Debug原理軟件

2010-08-04 10:13:40

FlexBuilder

2012-03-09 13:52:28

Adob??e AIRiOS

2012-03-09 13:26:53

2012-03-09 10:46:35

Adobe AIR是什Adobe AIRAIR

2011-08-08 13:35:50

Web應用WANWeb應用程序

2011-11-16 16:21:09

AdobeAIR

2011-11-16 15:47:04

AdobeAIRiOS應用

2010-11-25 10:05:22

Visual StudSilverlightWCF

2011-05-05 18:08:43

云計算Windows AzuPaaS

2010-02-04 09:41:03

Android應用程序

2010-03-26 13:12:27

2011-09-20 10:41:45

Web

2018-10-25 09:00:14

應用程序IMC平臺開發

2023-03-30 08:29:14

HTTP緩存Web應用
點贊
收藏

51CTO技術棧公眾號

精品中文视频在线| 久久久久国产精品厨房| 久久成人精品电影| 国产精品嫩草69影院| 日本不卡免费高清视频在线| 久久精品日韩一区二区三区| 91免费看片网站| 日韩欧美a级片| 成人精品天堂一区二区三区| 日韩精品一区二区三区三区免费| 青青在线视频观看| 日本在线观看网站| 成人18精品视频| 国产精品福利网| 欧美xxxx黑人xyx性爽| 国产精东传媒成人av电影| 91成人免费在线| 亚洲中文字幕无码一区二区三区| 你懂的在线播放| 国产91精品免费| 国产欧美日韩免费| 欧美h在线观看| 欧美国产综合| 正在播放亚洲1区| av黄色一级片| 涩涩屋成人免费视频软件| 91久久精品一区二区二区| 久草免费福利在线| 国产激情视频在线| 中文字幕不卡在线观看| 国产视频一区在线播放| 91精品国产91久久久| 免费高清在线观看电视| 国产精品手机在线播放| 亚洲精品按摩视频| 中文字幕1区2区| 久久久加勒比| 欧美伊人久久久久久午夜久久久久| 国产在线播放观看| 91中文在线| 国产精品毛片无遮挡高清| 乱色588欧美| 黄色a在线观看| 国产69精品久久99不卡| 成人在线观看视频网站| 日本天堂网在线| 亚洲国产日本| 久久久亚洲福利精品午夜| 国产女人18水真多毛片18精品| 欧美大片aaaa| 色偷偷亚洲男人天堂| 日韩不卡av在线| 国内精品久久久久久久久电影网 | 国产精品视频在线观看免费| 爽爽淫人综合网网站| 日本中文字幕不卡免费| 亚洲 欧美 成人| 男人天堂欧美日韩| 国产91在线播放精品91| 日本一区二区免费电影| 久久久亚洲一区| 日韩免费在线免费观看| 成人毛片一区二区三区| 亚洲自拍另类| 日韩av快播网址| 在线观看你懂的网站| 天堂av中文在线资源库| 一区二区乱码| 亚洲成人免费电影| 精品国偷自产一区二区三区| 女人天堂av在线播放| 亚洲永久精品大片| 成人午夜免费在线视频| 国产在线xxx| 精品久久久中文| 国产精品亚洲a| abab456成人免费网址| 欧美视频在线一区二区三区 | 一区二区视频在线免费| 国产黄色在线网站| 亚洲国产色一区| 日韩精品视频久久| yy6080久久伦理一区二区| 欧美精品高清视频| 丰满熟女人妻一区二区三区| 思热99re视热频这里只精品| 国产18精品乱码免费看| 久久久久久久av麻豆果冻| 亚洲v国产v在线观看| 国产激情在线视频| 亚洲成人精品影院| 日韩视频免费在线播放| www.欧美视频| 日韩电影大全免费观看2023年上| 国内精品卡一卡二卡三| 亚洲欧美一级二级三级| 欧美怡红院视频一区二区三区| 中文字幕在线观看1| 国产伦精品一区二区三区视频青涩| 粉嫩av免费一区二区三区| 精品无吗乱吗av国产爱色| 国产精品久久久久久久午夜片| 国内少妇毛片视频| 欧美精品资源| 亚洲国产免费av| 三级黄色录像视频| 精品国产av 无码一区二区三区| 亚洲永久免费精品| 成人在线国产精品| 日本免费不卡| 一区二区三区在线视频观看| 欧美伦理片在线看| 国产精品久久久网站| 色噜噜狠狠狠综合曰曰曰| 日韩精品国产一区二区| 久久99精品国产麻豆婷婷| 精品无人区一区二区三区竹菊| 男人和女人做事情在线视频网站免费观看| 亚洲第一综合色| 国内av一区二区| 亚洲美女15p| 久久久久久久亚洲精品| 国产精品女同一区二区| 久久精品夜色噜噜亚洲aⅴ| 91成人综合网| 国产日韩一区二区三免费高清| 亚洲美女精品成人在线视频| 久久久无码精品亚洲国产| 免费成人在线影院| 免费一区二区三区在在线视频| 日本理论片午伦夜理片在线观看| 欧美网站一区二区| 亚洲精品成人无码熟妇在线| 影音国产精品| 国产精品免费观看高清| www视频在线看| 欧美日本韩国一区二区三区视频 | 神马日本精品| 国产+人+亚洲| 黄色片一区二区三区| 亚洲一区免费观看| 又黄又爽又色的视频| 99久久99久久精品国产片果冰| 国产精品成av人在线视午夜片| 久久久久久久影视| 疯狂蹂躏欧美一区二区精品| 尤物网站在线观看| 韩日欧美一区| 国产精品二区二区三区| 久久亚洲资源| 亚洲成色999久久网站| 日韩免费一二三区| 豆国产96在线|亚洲| 日本人妻伦在线中文字幕| 免费观看性欧美大片无片| 久久国产精品久久精品| 国产熟女一区二区三区五月婷| 亚洲天天做日日做天天谢日日欢| 免费网站在线观看黄| 综合在线一区| 国产精成人品localhost| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美一级一区二区| 69av.com| av中文字幕一区| 国产成人精品无码播放| 日韩av密桃| 亚洲一区二区久久久久久| 欧美黄色视屏| 亚洲福利视频网| 日韩一级在线视频| 中文字幕视频一区| 无码国产精品久久一区免费| 亚洲伦理精品| 色阁综合av| 欧美不卡在线观看| 97精品欧美一区二区三区| 亚洲av成人无码网天堂| 欧美性xxxxxx少妇| 性色av无码久久一区二区三区| 成人妖精视频yjsp地址| 亚洲午夜精品久久久久久人妖| 国产乱码精品一区二区三区四区| 成人精品久久久| 97在线超碰| 在线播放亚洲激情| www三级免费| 一本一本久久a久久精品综合麻豆| 国产性猛交xx乱| 国产成+人+日韩+欧美+亚洲| 国产精品无码专区av在线播放| 国产精品88久久久久久| 久草一区二区| av成人在线网站| 欧美一区二区三区……| 求av网址在线观看| 亚洲第一男人av| 亚洲一区二区天堂| 午夜精品一区二区三区免费视频| 青青青手机在线视频| av电影天堂一区二区在线观看| 五月婷婷激情久久| 悠悠资源网久久精品| 亚洲国产精品久久久久婷婷老年 | 狠狠久久亚洲欧美| 国产黄页在线观看| 性xxxx欧美老肥妇牲乱| 久久久久资源| 视频精品一区二区三区| 国产精品久久久久久久7电影| hd国产人妖ts另类视频| 日韩在线观看免费高清完整版| 性感美女一级片| 日韩一区二区三免费高清| 精产国品一区二区| 天天综合网 天天综合色| 日本成人精品视频| 久久久久久97三级| 中文字幕影片免费在线观看| 国产精品一区在线观看你懂的| 天天操天天爱天天爽| 国产视频一区欧美| 欧美人与动牲交xxxxbbbb| 93在线视频精品免费观看| 欧美日韩一区在线视频| 狠狠一区二区三区| 成人av资源| 日韩一级淫片| 成人精品福利视频| 免费视频观看成人| 国产精品久久一区| 国产超碰精品| 日韩美女免费观看| 成人福利视频| 538国产精品视频一区二区| 怡红院在线播放| 久久色在线播放| 麻豆影视国产在线观看| 中文字幕免费精品一区| 国产在线一二三| 亚洲男人天堂网| 免费在线超碰| 亚洲人成在线一二| 日本一区二区三区在线观看视频| 亚洲国产日韩欧美在线99| 开心激情综合网| 亚洲国产精彩中文乱码av在线播放| 精品国产亚洲av麻豆| 欧美一级理论性理论a| a级片免费观看| 日韩午夜av一区| 亚洲va天堂va欧美ⅴa在线| 欧美成人在线直播| www.麻豆av| 精品成人一区二区| 亚欧在线观看视频| 亚洲欧美日韩爽爽影院| 国产中文字幕在线观看| 中文字幕日韩在线视频| 麻豆视频在线观看免费网站| 久久国产精品久久久久久| 亚洲小说区图片| 韩国日本不卡在线| 在线成人av观看| 国产日韩欧美黄色| 麻豆精品国产| 精品国产乱码久久久久久丨区2区| 鲁大师精品99久久久| 麻豆精品传媒视频| 国产一区二区在线| 中文字幕av日韩精品| 欧美精选一区| 自拍日韩亚洲一区在线| 免费视频一区| 午夜免费福利视频在线观看| 国产真实乱子伦精品视频| 极品人妻一区二区| 高清国产午夜精品久久久久久| 人妻无码中文久久久久专区| 国产欧美日韩一区二区三区在线观看| 极品美妇后花庭翘臀娇吟小说| 亚洲精品欧美激情| 青青草精品在线视频| 精品露脸国产偷人在视频| 免费精品一区二区| 日韩视频在线永久播放| 欧美日本网站| 久久九九亚洲综合| 这里有精品可以观看| 国产日韩精品在线| 免费看久久久| 久久久国产精华液999999| 99国产精品私拍| 91极品视频在线观看| 不卡一区二区在线| 国产精品久久久久久成人| 亚洲国产日产av| 中文字幕观看视频| 亚洲成人av片| 巨大荫蒂视频欧美大片| 91av在线视频观看| 日韩成人在线看| 日本在线观看一区| 一区福利视频| 国产乱码一区二区三区四区| 久久免费偷拍视频| 欧美日韩中文视频| 91精品欧美综合在线观看最新| 天堂a√中文在线| 九九热最新视频//这里只有精品 | 欧美精品aⅴ在线视频| 三级在线播放| 九九久久久久久久久激情| 精品视频在线一区二区在线| 激情视频在线观看一区二区三区| 婷婷亚洲图片| 婷婷六月天在线| 久久男人中文字幕资源站| 国产精品二区一区二区aⅴ| 91精品午夜视频| av网站在线播放| 欧洲s码亚洲m码精品一区| 丁香婷婷成人| 真人做人试看60分钟免费| 麻豆国产欧美日韩综合精品二区| 日韩乱码人妻无码中文字幕久久| 亚洲成av人影院| 亚洲第一页在线观看| 大胆人体色综合| 亚洲伊人精品酒店| 亚洲蜜桃av| 日本免费新一区视频| 日本少妇色视频| 午夜精品一区二区三区三上悠亚| 亚洲av无码国产精品永久一区| 久久精品福利视频| 91麻豆精品国产91久久久更新资源速度超快| 欧美精品欧美精品| 亚洲在线免费| 99久久人妻精品免费二区| 香港成人在线视频| 欧美一级免费片| 97在线视频免费播放| 精品视频高潮| 狠狠干 狠狠操| 99久久免费视频.com| 国产成人亚洲精品自产在线| 亚洲国产精彩中文乱码av| 麻豆理论在线观看| 蜜桃视频在线观看91| 三级久久三级久久| 四季av中文字幕| 欧美男生操女生| 国产黄色在线网站| av色综合网| 亚洲人www| 少妇精品一区二区三区| 日韩欧美在线播放| eeuss影院在线播放| 国产欧美一区二区三区久久人妖 | 久久91精品国产| av不卡一区二区| 亚欧无线一线二线三线区别| 久久久蜜桃精品| 亚洲一级特黄毛片| 欧美成人中文字幕| 国产精品x8x8一区二区| 日韩av资源在线| 中文字幕在线观看一区| av老司机久久| 91av视频在线免费观看| 成人情趣视频网站| 国产又粗又猛大又黄又爽| 亚洲成人午夜影院| yiren22综合网成人| 亚洲一区二区三区乱码aⅴ| 精品av久久久久电影| 波多野结衣福利| 欧美狂野另类xxxxoooo| 免费男女羞羞的视频网站在线观看| 久久99精品国产99久久| 免费人成精品欧美精品| 精品爆乳一区二区三区无码av| 日韩av在线免费观看| 成人国产精品入口免费视频| 久久免费一级片| 久久婷婷久久一区二区三区| 国产精品久久久久久无人区| 久久免费国产视频| 精品精品久久| 韩国三级hd中文字幕有哪些| 色婷婷国产精品久久包臀| 激情在线小视频| 久久99国产精品99久久| 国产在线乱码一区二区三区| 国产无遮挡呻吟娇喘视频| 久久激情视频免费观看| 亚洲欧洲美洲国产香蕉| 亚洲理论中文字幕| 欧美日韩国产综合视频在线观看中文 |