搜尋部落格文章

2014年2月7日 星期五

Flash與JavaScript溝通

透過類別ExternalInterface,可讓Flash與外部JavaScript進行溝通


  1. 執行外部JS方法
    ExternalInterface.call("your_js_function()");
    OR
    ExternalInterface.call("your_js_function");
  2. 執行外部JS方法並傳遞參數
    ExternalInterface.call("your_js_function","HelloWorld");
  3. 執行外部JS方法並接收回傳值
    var x:*=ExternalInterface.call("your_js_function");
實例:
  • 彈出對話視窗
    ExternalInterface.call("alert", "Hello World");
    OR
    ExternalInterface.call("function(){alert('something');}");
  • 設定cookies
    ExternalInterface.call("function(){document.cookie='random="+Math.random()+"'}");
  • 取得cookies
    var s:String=ExternalInterface.call("function(){ return document.cookie;}");
    var cookies:Array = s.split(";");

2014年1月28日 星期二

[轉] Shared Object共享資料

shared Object對象相當強大,他提供了在多個客戶端實時數據共享,並且可以存儲在客戶端或遠程服務器。 可以把本地共享對像比作cookies,把遠程共享對像看作實時的數據傳輸設備。
通常共享對象的使用方法如下:
1. 保持本地永久存儲這是最簡單的共享對象應用。 並且不需要FlashCom Server的支持。 例如,你可以使用SharedObject.getLocal方法來創建一個本地共享對象。 因為本地共享對像是永久存儲的,用戶端Flash結束的時候會通過data屬性保存在客戶端本地機器中。 當下一次運行swf文件的時候,就可以直接存取到。 如果你在影片播放結束的時候把共享對象的屬性置空了,下一次就存取不到任何的值了。
2. 在服務器端共享和存儲數據存儲在服務器端的共享對像數據可以被其它聯機的客戶端取到。 例如,你打開了一個遠程共享對象,該共享對像中存儲了一個電話清單。 當客戶端對該共享對像數據有任何更改的時候,改變的數據對所有聯機對像都是自同步的。 如果對象暫時無法連接到服務器端,那麼所作的更改將會在下一次更新到服務器端。
3. 實時交流數據共享對象可以實時的在多個客戶端之間共享數據。 你可以打開一個存儲實時數據的遠程共享對象,例如,一個連接到聊天室的用戶列表,當有用戶進入或離開聊天室的時候,該共享對象會實時更新,所有連接到該服務器的客戶端將立刻看到用戶列表的更改。
下面的例子演示了一個簡單的共享對象的使用,記住在創建一個遠程共享對象之前,必須先使用NetConnect對象聯機到服務器。
  1. 01 : // Create a local shared object
  2. 02 : so = SharedObject .getLocal('foo');
  3. 03 : // Create a remote shared object that is not persistent on the server
  4. 04 : nc = new NetConnection();
  5. 05 : nc.connect('rtmp://server.cuplayer.com/chat/room3';
  6. 06 : so = SharedObject .getRemote('users', nc.uri);
  7. 07 : so.connect(nc);
  8. 08 : // Create a remote shared object that is persistent on the server
  9. 09 : // but not on the client
  10. 10 : nc = new NetConnection();
  11. 11 : nc.connect('rtmp://server.cuplayer.com/chat/room3';
  12. 12 : so = SharedObject .getRemote('users', nc.uri, true);
  13. 13 : so.connect(nc);
  14. 14 : // Create a remote shared object that is persistent on the server
  15. 15 : // and on the client
  16. 16 : nc = new NetConnection();
  17. 17 : nc.connect('rtmp://server.cuplayer.com/chat/room3';
  18. 18 : so = SharedObject .getRemote('users', nc.uri, '/chat');
  19. 19 : so.connect(nc);

規劃遠程共享對像要規劃遠程共享對象,我們應該先設計一個數據管理模型。 我們需要做的是數據字段設計和管理、衝突解決、客戶端和服務器端的存儲分析,我們針對這些方面一一說明。
如果要使用本地存儲的遠程共享對象,請確保swf的舞台尺寸大於215×138像素,否則將無法正常顯示設置面板。
數據設計和管理共享對象關聯的數據存儲在共享對象的data屬性中,要設置共享對象的值可以使用下面的方式:

1 : //建立本地共享對象,沒有則自動創建
2 : var so = SharedObject.getLocal('local_so');
3 : //為共享對像中的變量賦值
4 : so.data.userID = 'Liu21st';
5 : so.data.currentStatus = 'onLine';
6 : so.data.lastLogon = '2004-06-30';

如果要創建客戶端的私有存儲,可以不通過data屬性,如:

1 : so.userID = 'Liu21st';
2 : so.currentStatus = 'onLine';
3 : so.lastLogon = '2004-06-30';

對共享對象的data屬性賦NULL或undefined可以初始化字段
so.data.userID = NULL ;
但是並沒有刪除該字段,如果要刪除請用:
delete so.data.userID;
我們也可以使用類似於
so.data.year.month.dayOfMonth = someValue;的方式來賦值
//注意該賦值並非一個字段year.month.dayOfMonth
//而分別是給三個字段year,month,dayOfMonth 初始化相同的值

但是不推薦使用該方式,因為這樣在同步的時候會始終佔用較多的帶寬使用分開賦值的方式可以避免每次同步全部數據
so.data.year = someValue;
so.data.month = someValue;
so.data.dayOfMonth = someValue;
你可以根據應用程序的需求來設計共享對象的變量。 如果共享對像中的值都需要頻繁更新,盡可能減少共享對象的字段可以提高性能。
站長經常使用的方式是:

1 : so.data.user = { id:1,sex:b,name:liu21st }
2 : // 在存取的時候可以使用
3 : // so.data.user.name的方式

2014年1月23日 星期四

Flash, Flex, AS3, AIR ... 傻傻搞不清楚

  • Flash : Both the name for the tool (Officially called Flash Professional CS#, but often called the Flash IDE), and the Platform. The Flash Platform is everything on this list, plus more. "Flash" also may refer to Flash SWF files. which is the compiled application.
  • Flex : Framework that uses MXML and ActionScipt. Includes many widgets, classes, etc for building rich applications in no time.
  • ActionScript 3.0 : Programming language that is used to create logic and interactivity throughout the flash platform
  • MXML : Declarative markup language used by the Flex framework.
  • Flash Player : The runtime environment that "plays" Flash SWF files.
  • Flash Builder : (Previously called Flex Builder) Code IDE based on eclipse, built by Adobe. Used to code anything for the flash platform, including ActionScript, Flex, AIR, etc. Also integrates nicely with the Flash IDE.
  • Adobe AIR : Adobe Integrated Runtime. Cross OS runtime, that lets you make Flash application that run and integrate with the desktop.
  • Flex SDK : Development Kit that contains a bunch of tools for building Flash, Flex, and AIR application. It contains the Flex compiler, that can be used to compile your Flash projects, including AS3 only projects.

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

[轉] 開始使用Adobe Scout (下)

ACTIONSCRIPT

到現在,你已經看到flash player 不間斷的活動,但你最關心的是可能是你的as 代碼在作什麼。actionscript 面板裡顯示了這些內容。
 開始使用Adobe <wbr> <wbr>Scout(下)
當你初看actionscript 面板,你可能看到一系列的函數的調用,為了得到說明和查看調用的棧,只需要點擊展開所有按鈕,它在自上而下設置的右邊。
 開始使用Adobe <wbr> <wbr>Scout(下)
你可以向下滾動調用棧查找哪個函數最費時間,如下圖,Context3D.present   的調用最費時間
 開始使用Adobe <wbr> <wbr>Scout(下)
默認情況下,actionscript 面板顯示向下而下的棧的調用,也就是入口點在棧的最上面,本地的調用在棧的最下面。反過來來看本地函數上花費了多少時間也非常有用,可以通過選擇自下而上來實現。
你可以得到每個包花費多少時間的高級視圖,通過打開在總結面板的actionscript 分類查看。
Actionscript 面板已經增加了用顏色區分不同的函數。本地用深藍錶示,用戶的as 代碼用淺藍錶示,stage3d用松石綠表示。下圖展示了用顏色標誌的向下而上的視圖。
 開始使用Adobe <wbr> <wbr>Scout(下) 
你也可以使用總結面板過濾你不想看到的包,下圖展示了只關注invawayders 包的效果。
 開始使用Adobe <wbr> <wbr>Scout(下)
在自下而上的視圖裡,父結節是你的函數,有自身時間列指示了在全部選擇的幀裡(not including any calls it might make into other functions) 它花費的時間。當你打開結點時你會看到自下而上的棧調用關係,它顯示了這個函數里調用了哪些其它函數,每個子函數對父函數的貢獻
ActionScript 面板展示了一個在幀和時間軸裡所有選擇的幀的actionscript 代碼的合計。一點要記住,這些數據是基於統計採樣的,也就是意味著你觀測的數據越多,得到的更準確的結果。如果你在右邊上面看到一個悲傷的小臉,意味著你需要選擇更多的幀。
ActionScript 面板的另一個有用的功能是你可以在首要活動和活動序列面板進行數據交互。
在這兩個面板裡,你可以單擊一個具體的活動在actionscript 面板裡實現過濾。例如下圖,展示了當你單擊首要活動的mouseDown 事件時,它僅顯示這個事件處理的內部的處理代碼。
開始使用Adobe <wbr> <wbr>Scout(下)


你可以過濾任何活動,不僅僅是as 事件處理函數。例如,下圖顯示了用垃圾回收活動過濾actionscript 代碼。不像一個事件,垃圾回收可以在你代碼執行的過程中觸發。用垃圾回收過濾讓你看到哪個函數引起了垃圾回收。你可以在調用棧裡看到。如果某個函數引起了過多的垃圾回收,它可能消費太多內存。
 開始使用Adobe <wbr> <wbr>Scout(下)
Trace log
當對actionscript 代碼進行採樣時,scout 收集trace() 的輸出。在幀和時間軸面板的事件面板裡的跟踪事件軌展示了哪一幀執行了trace ,而且如果你點擊了有trace 的幀,在活動序列面板裡同樣會顯示。你也可以選任意數量的幀並在跟踪日誌面板裡查看全部的trace 輸出。
 開始使用Adobe <wbr> <wbr>Scout(下)



會話信息
Scout 使你輕鬆和其它人分享數據。例如,如果你發現一個問題,你可以記錄下scout 會話,保存為flm 文件,並把它發給你的同事幫你debug 錯誤。像你運行在哪種機器上,你用的是哪個版本的flash ,這些信息很容易就會丟失。會話信息面板呈現了這些信息。它被分為幾個部分,提供詳細的讓scout 收集的遙測數據。

開始使用Adobe <wbr> <wbr>Scout(下) 

顯示列表渲染
你已經摸索了很多面板讓你來診斷flash player as 代碼正在幹什麼。但如果你的問題是關於渲染的呢?scout 的一個亮點之一就是使你發現底層的渲染問題。
如果你在使用傳統的flash 顯示列表渲染,你可以在新會話設置裡打開顯示列表渲染詳細信息選項,然後收集正在進行的詳細信息。當你選擇單幀時,你可以在顯示列表渲染裡看到。
 開始使用Adobe <wbr> <wbr>Scout(下)





如上面,當你選擇幀時,在面板的左邊有一系列正在渲染的傳遞並顯示它花費多長時間。染傳遞並不總是恰好和邊界對齊,因此你可能看到一個渲染的傳遞在一幀裡開始,然後在下一幀結束。在一幀裡,如果你看到多於一個完整的渲染傳遞,就是意味著你渲染過於頻繁,例如你可能在不需要的時候調用updateAfterEvent() 
默認下顯示列表渲染面板在熱圖模式下打開,這個屏幕的代表指示了哪個區域被重新渲染。
最白最亮的區域是最費時間渲染的,你可以在右邊的樹里點選擇一個對象,它會在相應的區域高亮顯示出來。它給你展示了對渲染傳遞和每一步的花費的詳細的分解。
通過切換到區域模式你可以得到渲染傳遞更詳細的視圖。如下圖,屏幕上的區域被分解為四種不同的類別,flash player 將它做為渲染引擎的一部分使用。明白這些分類對大幅度改善渲染的執行非常有用,例如,你不想對每一幀都改變的東西進行緩存。
 開始使用Adobe <wbr> <wbr>Scout(下)
   區域(紅色)框起來的是在屏幕上需要重繪的地方。這些信息和在debug 版的flash player  右鍵顯示重繪區域的內容是一樣的。

   更新的表面(藍色)是在這次渲染傳遞時要被更新的部分,表面是flash player 當使用濾鏡,blend mode,位圖緩存和位圖時不斷創建的位圖。
   緩存的表面(黃色)是被運行時緩存的表面,因此它可能被多幀復用,僅當這個渲染傳遞顯示時緩存被重新渲染
   顯示對象(綠色)是你加在顯示列表裡的矢量內容。再強調一遍,只有顯示對你在顯示時被重繪。
注意右邊的活動和它是相同的顏色系統。你可以點擊顯示的任何一個區域,相應的在樹上會相應相應的結點。如下圖,在有的結節左側會有小點,這表示這個結節會被重繪。
 開始使用Adobe <wbr> <wbr>Scout(下)

Stage3D 渲染
如果你在開發基於gup 加速的內容,你會使用新的stage3d api 使用GPU 加速渲染內容在桌面方面(Adobe AIR 3.0 以上和Flash Player 11 以上和移動方面(Adobe AIR 3.2 以上)是與平台無關的。你可能在開發3d 內容或使用如starling 這樣的將gpu 用於2d 內容渲染2d 框架,如果你在scout 中正好打開了stage3d 記錄,flashplayer 就會把每條執行到的stage3d 命令傳到scout 裡。也就是說,所有context3d 對象的調用會被記錄下來。Stage3d 渲染面板可以一步步的重新執行這些命令
 
開始使用Adobe <wbr> <wbr>Scout(下)



在這個面板裡,你會看到所有你所選擇幀裡執行的stage3d 命令。你可以點擊任何有關draw 的函數(Context3D.drawTriangles ),左邊的面板會立即更新顯示調用這個函數後後台緩衝區的狀態。按空格鍵會跳到下一個draw 函數調用的地方,按backspace 鍵會跳到前一個draw 函數調用的地方,這使得單步調試渲染的場景非常簡單。
 開始使用Adobe <wbr> <wbr>Scout(下)

如果你使用的是渲染到紋理(render-to-texture ),然後scout 會自動在後台緩衝區裡顯示你當前選擇的渲染目標對象。
每條stage3d 命令以簡潔的格式顯示,它帶有傳給命令的參數值。如果你不記得每個參數的含義,你可以右鍵命令選擇顯示參數名稱。
Stage3d 渲染面板可以單步調試draw 函數是因為scout 有在它內部正在運行的stage3d 擎的備份。Flash player 運行時並沒有把位圖傳給scout; 它只是傳每一條stage3d 命令和程序裡提供的參數,諸如程序,紋理,緩 ​​衝區這樣你就可以用你的方式研究探索你的場景,調試你的內容。
線框模式,在該面板上方的工具條裡打開,它僅使用重繪的三角形邊顯示場景的預覽,這樣回顧每一個對象並得知繪了什麼。
 開始使用Adobe <wbr> <wbr>Scout(下)

要使用stage3d 面板必須把允許stage3d 記錄選項打開,關於gpu 有用信息會記錄下來。
對任何stage3d 內容,你可以參考在總結面板裡得到gpu 內存會話,它也會在會話概況和幀和時間軸上打開相應的圖表。
 開始使用Adobe <wbr> <wbr>Scout(下)
你可以看到每個場景里數量的draw 方法的調用數量,並且能看到你上傳的主要的gpu 內存資源的分解。


Stage3d 程序編輯器
因為scout 有你執行的stage3d 命令的全部信息,你可以交互地修改每一條命令,然後看渲染的結果。每一次你調用Context3D.drawTriangles ,你就告訴gpu 運行兩個程序:在屏幕上定位若干位置的vertex program ,和在每一個三角形內容進行著色的fragment program stage3d 程序編輯器的幫助下,scout 讓你可以交互的查看和編輯這些程序。
Stage3D 渲染面板裡,點擊draw 函數調用的地方,然後看stage3d 程序編輯器,如下圖,stage3d 程序編輯器可以在窗口菜單裡選擇打開。它會顯示在調用draw 時供vertex   fragment 程序使用的AGAL 代碼。
 開始使用Adobe <wbr> <wbr>Scout(下)

開始使用Adobe <wbr> <wbr>Scout(下)
你可以交互的編輯這些代碼,然後點上傳讓scout 重繪場景。下圖展示了這個過程。
 //fragment program (agal 1) 
tex ft0, v0, fs1 <2d linear="" miplinear="" repeat=""> 
tex ft1, v1, fs2 <2d linear="" miplinear="" repeat=""> 
mul oc, ft0, ft1
上面頭兩行程序讀入兩個不同的紋理,最後一行將兩紋理相乘來決定最後輸出的像素顏色。
第一個紋理(fs1 )是建築牆的磚塊形,第二個紋理(fs2 )是陰影。
 開始使用Adobe <wbr> <wbr>Scout(下)
要看程序的改變如果起作用,改變最後一行,如下,它讓顏色基於第一個紋理(只顯示第一個紋理)。
 //fragment program (agal 1) 
tex ft0, v0, fs1 <2d linear="" miplinear="" repeat=""> 
tex ft1, v1, fs2 <2d linear="" miplinear="" repeat=""> 
mov oc, ft0
 

當你點擊上傳後,你會看到場景重新渲染了。你同時會看到一些命令變成purple 色了,表示這些命令使用了你的修改你也可以點擊重置,還原原始的狀態。

你也可以這樣修改,只顯示第二個紋理。
 //fragment program (agal 1) 
tex ft0, v0, fs1 <2d linear="" miplinear="" repeat=""> 
tex ft1, v1, fs2 <2d linear="" miplinear="" repeat=""> 
mov oc, ft1
 開始使用Adobe <wbr> <wbr>Scout(下)
這種交互能力對debug 來說非常有用,你也可以使用它學習如何使用AGAL 

常見問題
下面是一系列常見問題對你開始使用scout 可能有幫助。

1. Flash player   不能連接到scout
   確保你的scout 是最新的版本
   確保你的flash player 足夠新
   對於移動項目來說,確保你使用的是最新版的sdk 或者flash builder
   對於移動項目,確保companion app 是連著的
   同時確保.telemetry.cfg 文件內容正確並且位置正確
   核實scout 服務正在監聽。在瀏覽器裡輸入localhost:7934 ,如果有諸如“未收到數據”,“連接丟失”或其它類似的提示(因為scout 不是http 服務器),scout 應該會顯示“無法新建會話,因為telemetry數據無效” 。而如果瀏覽器等了很長時間然後跳出“服務器未發現”之類的提示,說明scout socket 服務沒在工作。
檢測你的防火牆設置。你也可以改變scout 的端口在首先項  > 監聽新會話的端口。
然後scout 會自動更新.telemetry.cfg 文件。
2.   如果IOS 或者Android Scout companion app 不能連接,試試如下方法。
   確保你的scout companion app 是最新的。
   如果 companion app 不能找到你的機器,看看輸入ip 地址能不能連接上。
   查看選擇其它的應用能不能連接到你的機器。你可能想在你的機器上建一個web
服務器連接試試。
   mac 系統,在系統首先項  > 共享,啟用web 共享
   windows ,啟用iis
   在你本機上試試能不能訪問本地的網站
   再試試從其它設備訪問
3.   如果是從chrome 里遠程分析
如果在chrome 裡你使用的是Flash Pepper plugin (默認的是),.telemetry.cfg 件在一個不是很好找的位置
MAC OS   
~/Library/Application Support/Google/Chrome/Default/ Pepper Data /Shockwave Flash/UserHome/.telemetry.cfg 

  Windows:  
%HOMEDRIVE%%HOMEPATH%\AppData\Local\Google\Chrome\User Data\Default\Pepper Data\ShockwaveFlash\UserHome\.telemetry.cfg 
4.   等待GPU 的意思
stage3d 的應用裡,你的cpu gpu 必須同步才能得到你想要的幀頻。如果一個負載了那個幀頻就會掉下來,有如下幾個可能。
 GPU  不能超過60fps 如果你想更新的比這快,他們就會成塊。如果你在構建60fps 的,對等待gpu 時間不要著急
   如果你的幀頻一持續很低,那麼就是你給gpu 的負荷太大了。你需要優化的3d 碼(或者在配置更好的設備上運行)。例如,試著渲染更少的三角形,使用AGAL 程序,或者使用更小的紋理。這時scout 不能直接顯示GPU 裡的什麼慢,因為它不能測算GPU 的時間。然而,如果你打開stage3d 記錄並查看stage3d 記錄面板,

你可以準備的看到哪個stage3d 命令在執行,對它進行單步調試,看看他們是如果影響屏幕的。你可能能發現更有效的方式。
   如果你的幀率抖動,擺動,或鋸齒圖案,你可能遇到關於cpu gpu 同步的問題,ADOBE 正在展開這項工作。
5. Scout  崩潰或者顯示錯誤,怎麼辦如果在你保存之前崩潰了,你可以從以下的路徑裡恢復數據,在這裡你可能發現很多的FLM 文件。
Mac OS: /var/folders/… …/Adobe Performance Data 
Windows: %HOMEDRIVE%%HOMEPATH%\AppData\Local\Temp\Adobe Performance Data 

注意  MAC OS ,實際的位置可以變的,所以最好的方式就是在/var/folders 搜索 "Adobe Performance Data" 如果在試著打開FLM 文件時Scout 再次崩潰,那麼你就是發現了一個bug 如果你提交你的FLM ADOBE,我們會解決這個BUG 並且會非常感激你的。
如果發生錯誤了,在scout log 裡有更多的信息。
Mac OS: ~/Library/Preferences/Adobe/Scout/1.0/logs 
  Windows: %HOMEDRIVE%%HOMEPATH%\AppData\Roaming\Adobe\Scout\1.0\logs