搜尋部落格文章

2014年1月18日 星期六

[轉] 用Adobe Scout精确的分析

來源頁面: http://www.adobe.com/devnet/scout/articles/accurate-profiling-with-scout.html 
資訊原標題: Accurate profiling with Adobe Scout
資訊原作者: Michael Smith
要求預備知識:為了學習本教程,請先閱讀Getting started with Adob​​e Scout。

用戶級別:中級

要求的產品:Adobe Scout



在您開始使用Adobe Scout的那一刻起,您將可以觀察大量的數據。 它幾乎觸及到您的內容裡的各個方面,Flash Player平台在ActionScript代碼執行的同時將其單獨的呈現出來。 從一開始它就在尋找您的內容裡的性能問題,但在您使用前,先去了解這些數據是如何蒐集的。


Flash Player傳遞給Scout的每一條數據都是有代價的。 除了執行您的內容,Flash Player必須花費時間繪製它自己和傳遞這些數據。 這意味著當您用Scout調試時,Flash Player的行為相對於正常的執行有所不同。 依據您所選擇要收集的數據,這個不同之處可能會微不足道或者很明顯。 這種情況將取決於您試圖應對的問題。


在這篇文章裡,您將了解Flash Player是如何繪製和傳遞數據給Scout,以及如何決定收集哪些數據。 這將有助於您更準確的應對關於您的內容的中的行為和性能。 通過更好地了解這些數字在Scout裡都意味著什麼,將增加您profiling時的信心。

需要注意的是,這不是Scout的界面指南,如果您不知道如何使用Scout,或者裡面每個面板的作用,您可以閱讀這篇文章getting started guide。 http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html


在Scout裡獲取從Flash Player發來的數據


當您開始使用Scout,在您加載Flash內容的同時您將注意到Scout啟動了一個新的會話和數據被傳遞了過來。 這些數據被稱為Telemetry。 它是Flash Player在執行內容時收集的基本數據流。 為了使之運轉起來,Scout必須能夠通知Flash Player傳遞哪些數據,以及Flash Player必須能夠連接Scout和傳遞數據。


Scout 是如何通知Flash Player傳遞數據的?


Scout是通過在您的主目錄下一個叫.telemetry.cfg的文件通知Flash Player如何做的。 這個文件裡記錄著Scout運行在那一台機器上,監聽著那個端口,以及Flash Player需要收集那些數據(即您在Scout的Settings for New Sessions面板裡勾選的選項)。 如果您的Flash Player和Scout運行在同一台機器,您根本不必去理會這個文件。 在您修改任何設置的時候,Scout都會將其寫入這個文件,而Flash Player會在加載新的SWF時去讀取這個文件。 您在一個已打開的會話裡所改變的設置,將應用在新的會話裡。


如果您的Scout運行在不同的機器上,而您又想要Flash Player傳遞數據給它,這時您就需要手動的配置.telemetry.cfg文件。 這點在getting started guide文章裡已有說明如何操作。 記住這一點,您需要配置Scout去監聽您在這個文件裡指定的端口。 您可以在Scout的首選項對話框裡設置。


如果您打算在移動設備上調試Adobe AIR內容,您可以在合適的應用商店裡下載iOS,Android,和Kindle的Scout Companion App。 這個應用連接到一個Scout實例上,通過與Scout的通信確定您的數據配置。 這個過程沒有用到.telemetry.cfg,取而代之的是,這個companion app直接轉發此信息給運行中的Adobe AIR實例,然後他們就知道要把哪些數據傳遞給哪裡的Scout。


Flash Player是如何傳遞數據給Scout的?


當Telemetry是可用的(即有一個.telemetry.cfg文件在您的主目錄下),Flash Player在加載一個新的SWF時會嘗試去打開一個TCP連接到Scout上。 如果失敗了,Flash Player會禁用Telemetry和繼續運行,此時將不會有任何profiling的開銷。 如果連接成功了,Flash Player開始傳輸數據到Scout的一個新會話上,Scout在呈現給您之前會解析這些被稱為AMF的一種壓縮的二進制格式數據。 當您保存一個FLM文件時,您其實已經保存了Flash Player傳遞過來的原始數據,同樣的是二進制格式。 這意味著,當您打開一個FLM文件時,Scout其實只是在快速的把從您的內容裡獲得的數據重新播放出來。


決定收集哪些數據

Scout接收的每一塊數據都是通過Flash Player.傳遞過來的。 如果您請求更多的數據,Flash Player將不得不增加更多的額外工作,從而將影響您的內容的性能表現。 正因為如此,當您決定要收集哪些數據時,考慮這些type of question是很重要的,從Settings for NewSessions(新會話的設置)知道那些選項應該勾上(如圖1)。
用Adobe <wbr>Scout精确的分析
圖1使用在Scout裡的“新會話的設置”面板,選擇您想要獲得的數據。

如果您想測量性能,您需要限制自己去收集低開銷的數據:基本Telemetry、ActionScript取樣器、CPU使用率。 這些都是經過精心設計的,相比執行您的內容,Flash Player只花費了很少的時間去收集和傳遞這些數據給Scout。 這意味著當您正在尋找性能問題時,您可以相信在Scout上看到的時間測量,這點是必不可少的! 

如果您想收集關於渲染的詳細信息,您也可以勾選這個帶來高開銷的設置:顯示列表渲染詳細信息和Stage3D記錄。 這些對於調試圖形的相關問題非常有用,他們分別讓您看到每一幀上繪製的顯示對象和Stage3D的命令執行的精確序列。 這種詳細程度是有代價的。 因為Flash Player需要花費更多的時間去收集和傳遞這些數據給Scout,從而減慢了您的內容。 如果您決定收集這些數據的話,您在Scout上看到的時間信息將是不准確的。 由於Flash Player做了這些額外的工作,導致某些執行時間將會比實際顯示得更長。不僅如此,因為一些活動對像比其他繪製的更詳細,使得這些結果將會有所偏倚。 

請記住,如果您想得到準確的性能數據,請保持低開銷! 您同時不能得到詳細的渲染數據和準確的時間測量。 這就像在試圖採訪飛人博爾特而他正在100米競賽中。 當您用麥克風催促他時,他不會打破任何世界紀錄! 

基本Telemetry和ActionScript取樣器 

如果您對性能方面感興趣,您應該開啟“基本Telemetry”和“ActionScript取樣器”這兩設置。 雖然剛開始時有點混亂,但是他們準確的收集著兩種不同類型的數據。 當Flash Player執行您的內容時,有兩個核心在一起運轉著: 

Flash Player,做著實際的工作,並給外界提供接口。 在其他任務中,它渲染著屏幕、播放聲音和視頻,同時處理著輸入和聯網事件。 
您的SWF,包括一大部分基本的靜態資源,比如圖片,還有動態資源,比如scripts and timelines(腳本和時間軸)。 這些動態字體通過FlashPlayer來執行,並告訴它需要做些什麼。 
為了只在關鍵的地方測量自己,Flash Player改寫了代碼庫。 他測量在執行關鍵的代碼塊時花費了多久,和關鍵的數據結構佔用了多少內存。 在這裡一個關鍵詞是"key"。 如果Flash Player在每個單獨的方法裡都計算花費的話,這將產生太多的開銷,同時比在非調試的情況下運行得更加的慢。 因為就如大家所知的,它僅僅測量活動對象就需要顯著的時間量,相比而言這些測量的開銷是可以忽略不計的。 換言之,您在Scout上看到的時間值是盡可能準確的。 這些數據被稱為基本Telemetry,它被用於在Scout上繪製幀時間 ​​軸、總結、活動序列、和首要活動面板。 請注意,FlashPlayer僅會報告花費大於5ms的活動,任何低於這個點的活動都不會在Scout上顯示。 
Scout還顯示關於您的SWF中的ActionScript 3執行信息。 當您開啟ActionScript取樣器設置時,您可以在ActionScript面板看到這些信息。 這些數據與基本Telemetry是非常不同的。 Flash Player無法提前知道您的代碼將是什麼,因此它不能進行提前檢測。 還有,如果FlashPlayer記錄和發送每一個函數調用給Scout,它會增加太多的開銷從而影響其準確性。 Flash Player會從執行中的ActionScript取樣,每一毫秒,它都會從調用堆棧裡獲取快照,以此代表在該特定的時間點您的代碼都做了些什麼。 
在Scout上的ActionScript面板裡,這些數據收集於您所選擇的幀範圍,讓您看到在這段時間裡,每個函數的平均花費。 這些數據是基於統計採樣的(只顯示到毫秒,因為這是採樣頻率),如果您觀測的數據越多,得到的結果會更準確(例如,在選擇更多的幀時)。 您應該時刻注意在ActionScript面板上的數據質量指標。 一個悲傷的小臉(如圖2),意味著您沒有查看足夠的數據用於採樣統計,而一個開心的小臉(如圖3),意味著那些數據是準確的,足以讓您決定哪些函數是代價最高的。 
用Adobe <wbr>Scout精确的分析
圖2 當只有很少的樣本時請注意這個ActionScript面板。
用Adobe <wbr>Scout精确的分析
圖3選擇足夠的數據使之結果符合採樣統計 
理解測量和採樣的區別是很重要的,因為這兩種類型的數據具有不同的精度。 想像一下,您在坐過山車,需要衡量全程持續了多久。 使用測量的方法,您需要攜帶一個秒錶,在出發前啟動它,直到終點才停止(如圖4)。 這可以給您一個相當準確的結果(例如,精確到秒),但它需要一定的時間來啟動和停止秒錶,記下每個測量。 如果您在每一次乘坐時這樣做,它會讓您在主題公園的一天過得更長一點(假設您每次只能做一件事)。 在這個例子中,讓我們告訴您測量23秒的這段時間。 
用Adobe <wbr>Scout精确的分析
圖4 使用儀器測量一段時間

以採樣為例,而不是帶著個秒錶,您設置了一個攝像頭每​​10秒拍攝這段車程(或任何您選擇的時間間隔)(如圖5)。 這是侵擾程度較低的,因為您不必隨身​​攜帶一個秒錶進行測量,但它也不夠精確。 在這個過山車通過後,您看到多少張移動照片(這種情況下,兩個),然後乘以照片之間的時間間隔(在這種情況下,10秒)。 這給了您一個持續20秒的近似乘坐的時間。
用Adobe <wbr>Scout精确的分析
圖5 採用抽樣測量持續時間的過程。



採樣相比測量方法來說不太精確,但您重複的時間越長(多次坐過山車),相對誤差會比較小。 這就類似於ActionScript取樣器的工作原理。 “照片”是調用堆棧的快照(稱為樣本),而且他們每毫秒都在收集。


在Scout裡一個有用的特性是,它有能力通過一個真正有用的方式結合這兩種類型的數據。 例如,在Flash Player的代碼層裡檢測用於接收鼠標的事件,使之顯示了在基本Telemetry。 這給了您一個微秒的精確測量過了多長時間來處理這個事件。 如果您有一個ActionScript 3的事件處理程序,則Flash Player在您的代碼執行時,還收集它的樣本。 在Scout當您選中首要活動面板,單擊事件,Scout將過濾ActionScript面板,它僅顯示這個事件處理的正在運行的代碼(如圖6)。

用Adobe <wbr>Scout精确的分析


圖6使用首要活動面板測量的數據,過濾ActionScript面板中的採樣數據。 


在總結面板中結合了基本Telemetry和ActionScript取樣器中的數據。 在此面板中的數據大多來自基本Telemetry,但如果您已經開啟ActionScript取樣器,您可以展開ActionScript類,從中查看消耗最大的點在那個包裡。 只要記住,這些數據是近似的,因為它是通過抽樣計算得來的(不像在總結面板中的其餘部分的數據)。 用“≈”符號來表示(如圖7)。 
用Adobe <wbr>Scout精确的分析

圖7總結面板顯示測量數據和採樣數據 


以下簡要介紹了兩種類型的數據: 

基本Telemetry(活動序列面板,首要活動面板),提供給您Flash Player都做了什麼時序測量。 Flash Player通過輕量測量方式提供這些數據,它具有微秒級的精度。 

ActionScript取樣器(ActionScript面板),給您的ActionScript 3代碼做著定期的快照。 每毫秒,它需要調用堆棧的一個樣品,並聚集該數據隨著時間的推移,向您展示每個函數平均所花費的時間百分比。 時間是近似的,但選擇的幀越多得到的更準確,所以一定要尋找開心的小臉! 

CPU使用率 

如果您打開CPU使用率設置,Flash Player將採取定期測量的方式,獲得它使用了多少CPU時間。 它獲取該數據是通過查詢操作系統,因此它對應於OS X的活動監視器,或者Windows的任務管理器。 它是低開銷的,所以在您要調查您的內容的性能時可以開啟它。 

顯示列表渲染詳細信息 

如果您在您的內容裡使用了Flash顯示列表,那麼這個“顯示列表渲染詳細信息”的設置,讓您可以記錄關於每個渲染通道上的屏幕重繪和每個顯示對象的渲染消耗時間的詳細信息。 在Scout的“顯示列表渲染”面板您可以看到這些信息。 特別是,熱圖模式以圖形方式顯示消耗最長的屏幕重繪渲染。 

收集該數據的開銷取決於有多少對像在顯示列表上。 這可能會有相當大的開銷,所​​ 以您不應該在看您的內容的整體性能時開啟這個設置,只有在相對的時間來呈現每個DisplayObject。 一個良好的工作流程如下: 
1.僅在基本Telemetry啟用時調試您的內容,並查看花了多少時間在做顯示列表渲染,相比其他的活動,如執行中的ActionScript。 
2.如果顯示列表渲染是一個問題(因為它佔用了太多的時間),然後打開顯示列表渲染詳細信息設置,重新調試您的內容。 然後您可以使用Scout的顯示列表渲染面板,確定問題的根源。 

Stage3D記錄 

如果在您的內容裡使用了Stage3D(無論是直接的,或使用一個框架,如Starling或Away3D),Scout可以給您提供詳細的正在運行的信息。 在Flash Player中的Stage3D API是可測量的,所以它可以發送每一個Stage3D的API調用和參數到Scout上。 然後,在Scout裡您可以逐條命令重放,看每次一個繪製調用是如何呈現在每個場景的。 能夠這樣做是因為Scout里內嵌了一個Stage3D引擎的副本。 
開啟Stage3D記錄設置會產生一個巨大的數據量,並帶來高開銷。 這是因為Flash Player要送每個buffer,texture和AGAL程序到Scout上,以及您對Stage3D API每個函數調用的詳細信息。 這是一個很大的數據量,還有收集和發送它會減慢您的內容的執行。 在您要調試渲染問題的時候,開啟Stage3D記錄有好處的,但您永遠不應該調試性能時開啟它。 如果您嘗試開啟它時,ActionScript面板甚至會警告您(如圖8)。 
用Adobe <wbr>Scout精确的分析

圖8如果您開啟了Stage3D記錄,在ActionScript面板會有這個警告 


如果您關心性能,您應該進行以下步驟: 

在僅有基本Telemetry和ActionScript取樣器啟用時調試你的內容。 在Scout的總結面板中,展開ActionScript類別來查看Stage3D API花費了多少比例的時間。 ActionScript面板會顯示那個具體的函數調用花費的時間最長。 

您可以開啟Stage3D記錄,如果您的內容中的Stage3D API花費了太多的時間。 在Stage3D渲染面板,Scout會顯示每一個Stage3D API調用您的內容的操作。 這對於尋找性能問題的原因,如產生太多的重繪調用或頻繁的改變GPU狀態往往是非常有用的。 

如果您需要調試一個渲染問題,如一個AGAL程序沒有按照您預期的方式工作,您可以直接跳轉到第二步。 但請記住,當您想提高您的內容的表現時,您應該先找出Stage3D是否是問題的一部分,然後再試圖優化它! 

由於Stage3D記錄非常容易在幾分種裡產生GB級的內存數據。 Scout有一個“延時記錄”模式,因為您可能要在您的內容已經運行了一段時間,發生了渲染問題才調試(例如,確定22級的dragon boss為什麼沒有陰影)。 如果您將記錄設置由“直接”更改為“延時”,Flash Player將和以前一樣發送相同的詳細Stage3D的數據,但它不會加載到Scout的內存中。 當您在Stage3D渲染面板單擊“開始記錄”,Scout只將需要的數據加載到內存中(如您的模型和貼圖)。 這使得您可以在不使用盡可能多的內存的情況下,重複測試這些命令。 

在Scout裡獲得準確數據的技巧 

您已經明白為什麼選擇正確的數據設置對於用Scout準確地調試是這麼的重要了。 但是你的調試環境也是重要考慮因素。 如果您不這樣做,您可能得到非常誤導性的數據,並把時間浪費在試圖解決一個不一定真的存在的問題! 在用Scout做性能分析時,這裡有一些重要的提示: 

使用Flash Player的“發行版本”做分析。 對於其他版本,如調試版(debugger),具有不同的性能特點。 

使用“SWF的發布版本”做分析。 調試版的SWFs運行要慢得多,因為為了幫助您調試您的內容,它們的ActionScript字節碼設計得很重量級。 

用您預計您的用戶將使用的相同“硬件、操作系統和瀏覽器”做分析。 您的內容可能在您的超快速的開發機器上運行良好,但對於普通用戶將如何運行? 

在您做分析時不要運行其他程序或SWFs。 這些會干擾Flash Player的測量,使得它可能最終報告了誤導性的信息。 盡可能的減少運行的程序,並關閉任何其他您可能打開的瀏覽器選項卡。 

當在做分析時避免使用VMware或設備仿真器(device emulators)。 如果可能的話使用一個本地的機器或設備,因為它的性能特點將最接近您的用戶體驗。 如果您需要使用VMWare,然後確保將其設置為使用一個以上的核心。 如果它只有一個核心的話,在用Scout時它將無法正常的工作(這是一個已知的問題)。 

如果您在移動設備上做分析,請確保您的網絡有足夠的帶寬用於Flash Player發送它的數據給Scout。 如果沒有,網絡連接將成為一個瓶頸,這將在Scout帶來誤導性的信息。 

下一步閱讀方向 

鑑於您了解了Scout是如何收集這些數據的,您可以更準確和更有效的分析您的內容。 請記住,僅收集您需要的數據來解答您目前正在處理的問題。 盲目的打開所有的設置最終將扭曲這些數據,並可能導致您最終優化了錯誤的事情! 
一旦您已經確定了性能問題,下一步就是要確定為什麼這裡會有問題,和它都做什麼。 要了解更多的有關FlashPlayer如何運作,和要怎麼處理Scout顯示給您的信息,請參閱Understanding Flash Player with Adobe Scout。http://www.adobe.com/devnet/scout/articles/understanding-flashplayer-with-scout.html

from:http://blog.sina.com.cn/s/blog_6bfa2fc10101brf7.html

沒有留言:

張貼留言