[转]优化Flash性能
原文:http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html
翻譯:http://bbs.9ria.com/thread-156860-1-1.html
?
?
在這篇文章中,你會學到優化Flash Professional應用性能的策略。優化過程包括編輯你的FLA工程文檔確保發布的應用程序幀頻可以滿足動畫的播放流暢。
?
如果你曾運行過一個Flash工程,見過播放總是停頓的動畫,當然這種情況你非常不想看到。如果你想來做測驗重現這種停頓的動畫,可以創建一個有簡單動畫的工程,然后設置幀頻為小于10的任意數字(例如5)。然后發布,可以看到這個動畫有多么停頓了。
?
有兩個主要因素可以決定Flash的性能:CPU或GPU[解釋:圖形處理器(Graphics Processing Unit)?]的使用和內存的使用。這些因素不是互相獨立的。一些優化方法也許在這個方面可以提升性能,但是會對另一個方面有副作用。在下面的單元里,我會解釋他們的工作原理,提供一些讓你可以明確的做決定的原因,比如,為了降低CPU或GPU的加載而增加內存的使用。
?
如果你是為移動設備開發Flash游戲的,很可能你需要一些下面將要討論的技術手段來達到可接受的幀頻。如果你是開發桌面應用的(非游戲),很可能用很小的幀頻就可以達到可接受的效果,或者不熟悉這篇文章里描述的技術也可以。
?
判斷和衡量游戲性能
?
在理想的世界里,Flash的測試環境允許你模仿目標平臺,然后根據目標平臺的情況判斷你的應用運行情況。不幸的是,除非你的開發平臺和目標平臺相似,否則現在還不能評估出在測試環境中你的項目的運行情況。
?
除非,你在開發環境中衡量你的應用性能,然后定期讓它在目標平臺中運行一下,確認它在目標平臺也運行良好。
?
如何你在目標平臺測試項目并發現問題,你可以用MT類來調試你的應用來解決問題。(在提供的例子文件文件夾內,打開位于這個目錄的AS類:MT/com/kglad/MT.as。)
?
內存追蹤,內存使用,和性能測試
MT代碼改編自Damian Connolly,可以訪問他的網站。這個MT類會打印出幀頻、內存消耗,列出內存中存在的對象。為了更好使用MT類,遵循以下步驟:
?
1.導入MT類:
??import com.kglad.MT;
?
2.在文檔類里初始化它,或在項目的主時間軸上這樣寫:
??MT.init(this,reportFrequency);
??上面這行代碼,“this”表示引用影片的主時間軸,“reportFrequency”表示一個有符號整數(這個數字是自己填的)。主時間軸的引用是用來計算和實現幀頻的,reportFrequency是頻率(以秒計算),它會跟蹤一個Flash應用的幀頻輸出報告和內存數量的消耗。如果你不想定時輸出幀頻和內存報告數據,傳0(或比0更小的數字)。即使你選擇不輸出幀頻,你仍然運行了這個類的內存跟蹤。
?
3.為了跟蹤應用里你創建的對象,加上這句話:
MT.track(whatever_object,any_detail);
上面這行代碼的第一個參數是你想跟蹤的對象(看看它是否從內存中移除了),第二個參數是可選的字符串,它包含任何你想測試的東西。(有些開發人員會用這個參數得到特定對象是什么,在哪和或者存在的時間等細節。)
?
4.為了創建報告,顯示你跟蹤的對象是否還在內存里,加上這句話:
MT.report();
你沒必要了解MT的代碼,只管用就行了。但是,了解一些Dictionary類是如何存儲所有傳給MT.track()的弱引用也是好的。這個類里包括如何使用它的注釋。
?
在這篇文章的開頭提供了許多使用MT類的示例文件測試。為了更多的學習MT類,查看這些測試例子看看MT類是怎么用的。
就像物理里的觀察者效應,我們觀察幀頻和(或者)內存,和(或者)跟蹤內存,改變應用的幀頻和內存使用情況。但是,如果觀察輸出結果比較少很可能觀察的效果也會降低。此外,沒有絕對的觀察數字。每過一段時間調試和優化,改變幀頻和/內存使用的情況才是最重要的。MT類很好的做到了承擔追蹤這些變化的責任。
?
為了降低因為頻繁調用trace方法,而出現虛假的低幀頻情況,MT類不允許每秒輸出結果。(trace方法本身會降低幀頻。)要十分注意這點,如果可以的話,你可以用textfield代替trace方法,來盡可能的消除調用trace方法給幀頻帶來的混淆影響。
?
在范例文件測試工程里,MT類是唯一的工具來檢查內存使用和精確的內存問題。你也可以直接檢查CPU或GPU的使用情況(查看執行應用程序時幀頻的實際使用情況【就是看資源管理器】)。
?
?
實現優化算法
?
?
?
在這個單元,我會開始做一些內存管理的指導,下面單元標題的順序是按照首字母排序的。然后為了這個目的,我會提供有關CPU/GPU管理信息的子標題來探討。
?
?
?
也許我們會覺得提供兩個單元的技術是合理的。但是,如果你通讀完這篇文章,知道了用內存管理影響CPU/GPU的方法,那么列出的內存管理的建議,可以和CPU/GPU單元里列出的方法一起使用,這樣效果會更好。
?
?
?
在為你提供特定的最佳實現方法之前,我認為技術問題同樣重要,知道的多了你就學的輕松,反之就會很累。我同樣會列第二個清單,它會按技術獲益的優先級次序從高到低排列。
?
記住這些清單是主觀的。它的順序是依據個人開發經驗和能力來定的,還有測試情形和測試環境。
應用的優化技術從易到難排列
?
1.不要使用濾鏡
?
2.盡可能使用倒序for循環,避免使用do循環和while循環
?
3.明確的停止使用Timer,以便垃圾回收
?
4.使用弱引用時間偵聽器,當不用的時候移除
?
5.盡可能在任何時候嚴格定義變量類型
?
6.當不需要鼠標交互的時候明確的禁用鼠標交互
?
7.盡可能在任何時候使用回調函數來取代dispatchEvent(繼承的)類
?
8.不需要聲音時停止Sound類,以便垃圾回收Sound(繼承的)類和SoundChannel(繼承的)類
?
9.盡量讓每一個所需的元素使用最基本的DisplayObject類
?
10.Air應用(移動設備)總是使用cacheAsBitmap 和cacheAsBitmapMatrix (前一個是位圖緩存,后一個是位圖矩陣緩存?我沒用過)
?
11.盡可能在任何時候重新使用Object
?
12.Event.ENTER_FRAME循環:使用不同的偵聽器和不同的偵聽函數應用在盡可能少的DisplayObjects 上
?
13.用PoolObject(對象池)取代創建和垃圾回收Object
?
14.使用局部位圖傳輸(塊傳輸)
?
15.使用階段的塊傳輸
?
16.使用Stage3D
?
?
?
優化技術后好處由大到小排列
?
1.使用階段的塊傳輸(如果有足夠的系統內存)
?
2.使用Stage3D
?
3.使用局部位圖傳輸(塊傳輸)
?
4.在移動設備上使用cacheAsBitmap 和cacheAsBitmapMatrix
?
5.當鼠標交互不需要的時候明確的禁用鼠標交互
?
6.不要使用濾鏡
?
7.需要的時候使用最基本的DisplayObject類
?
8.盡量在任何時候重新利用對象
?
9.Event.ENTER_FRAME循環:使用不同的偵聽器和偵聽函數,他們最好應用在盡可能少的DisplayObjects 上
?
10.盡可能使用倒序for循環,避免使用do循環和while循環
?
11.用PoolObject(對象池)取代創建和垃圾回收Object
?
12.盡可能在任何時候嚴格定義變量類型
?
13.使用弱引用時間偵聽器,當不用的時候移除
?
14.盡可能在任何時候使用回調函數來取代dispatchEvent(繼承的)類
?
15.明確的停止使用Timer,以便垃圾回收
?
16.不需要聲音時停止Sound類,以便垃圾回收Sound(繼承的)類和SoundChannel(繼承的)類
?
記住這些優先級排序,然后前進到下個單元,學習如何更新你的Flash工程來更有效率的管理內存。
?
?
管理內存
?
下面列的建議不夠詳盡,但它包括了那些可以大幅度提升Flash性能的策略內容。
?
?
?
使用回調函數?VS dispatEvent
?
?
?
當派發事件的時候會增加內存的使用,因為每個事件必須被創建并且分配內存給它。這種行為是這樣解釋的:事件也是對象,因此也需要內存。
?
我試著發送少量事件,發現每個消耗40到128字節。我也發現使用回調函數會使用更少的內存,比使用事件效率更高。(查看在實例文檔里的測試文件callback_v_dispatchEvent。)
應用濾鏡
?
?
?
當你大量應用濾鏡時也很消耗內存。根據Adobe幫助文檔,使用一個濾鏡會消耗雙倍內存。在真實Flash Professional CS6的測試環境中,我曾發現使用濾鏡的確會增加內存消耗,但是這種消耗不接近雙倍內存。(回顧測試范例,在filters文件夾下)
?
?
?
為每個元素使用正確類型的現實對象
Shape,Sprite,和MovieClip對象每個都使用不同的內存數量。一個Shape對象需要236字節,Sprite需要412字節,MovieClip需要448字節。
?
?
?
如果你在一個工程里使用上千的顯示對象,如果不需要交互的話,你也許需要大量Shape類來拯救你的內存。或者,當不需要時間軸時使用Sprite類。
?
?
?
對象池
?
?
?
當你打開你的應用時,要創建各種你會一直使用的對象引用,對象池可以將這些引用保存在數組里。任何時候一個對象需要時,就可以從這個數組里取出使用。
無論何時當一個對象不再需要時,把它再重新放回數組里。
?
有種常規做法是用Vector來代替Array來存儲相同類型的對象。使用Vector也許可以比使用Array快兩倍,但是!除非你要做成百上千次的操作,否則你不會注意到兩者的差別,因為小于上千次的操作它們一樣快。(可以看看array_v_vector 文件夾下的范例文件。)
使用對象池可以獲得性能上的好處,同時更主要的收益是讓管理內存變得簡單。如果你在內存利用方面有無限制增長的問題,用對象池可以很好的解決,它是提高性能、降低內存使用的通用技術。
我看到當測試一個每幀包含許多要垃圾回收和再利用的SWF文件里,使用對象池后幀頻快了10%,而內存使用則減少了10%。(可以查看pooling_v_gc 文件夾里的范例。)
重用對象
?
?
?
當你要在一個循環里創建許多對象時,最好在循環外先創建一個對象,然后再循環里重復利用它。當然這個方法也不是對所有工程都有效的,但在很多情況下這個技術還是有用的。
在描述位圖傳輸的單元包括一個重用大量對象的例子。你可以在測試文檔里看這是怎么實現的。
處理聲音
?
?
?
有關聲音的問題在內存使用方面是非常小兒科的。當播放一段聲音時,它不可能被垃圾回收的(可以使用Flash Professional CS6來測試文件)。當聲音播放完或一個SoundChannel實例執行停止聲音時,Sound類就準備垃圾回收了。(想學更多的話可以看看名為sound_test 文件夾下的范例。)
使用Timer
?
?
?
使用Timer時要格外小心。如果沒有停止Timer(有兩種情況:1.currentCount 屬性小于它的循環次數;2.沒有調用stop()方法),Timer就不會被垃圾回收,即使你已經移除了偵聽器,然后將所有引用設為null。一旦你移除了偵聽器,Timer的偵聽函數就不被再次調用,但是Timer卻仍然消耗內存。
?
?
?
Timer類僅僅使用72字節的內存,所以很可能在一個基于桌面/瀏覽器的Flash游戲里成為一個很不起眼的問題。但是,當你在移動設備里反復的打開、播放、關閉游戲,然后不斷重復啟動游戲,你也許就看到這個難以忽略的問題了。
?
?
?
看看這個代碼,打開命名為gc_timer_test文件夾下的文件。
弱引用偵聽器?VS?強引用偵聽器
?
?
?
另一種無法預料的測試結果是,你使用MT類沒有辦法看出使用弱引用偵聽器和強引用偵聽器的差別。在Flash Professional CS6環境下我的測試里它們都被當做弱引用偵聽器來對待。(查看strong_v_weak_listeners 文件夾下的范例。)
?
管理CPU/GPU使用情況
?
當前,我唯一知道如何直接查看的工具就是使用操作系統自帶的。Windows里有一個任務管理(性能選項卡)和Mac OS提供的活動監視器。這兩個工具都可以讓你看CPU的使用情況,但是一般來說,它們對測試Flash性能不是特別有用。
?
結果,你直接查看CPU/GPU的使用只能通過檢查你應用的幀頻了。MT類可以讓你檢查項目的幀頻,還有內存使用報告和內存跟蹤。
?
處理cacheAsBitmap 和cacheAsBitmapMatrix
使用DisplayObject的cacheAsBitmap屬性可以大幅度提高性能(和內存),只要DisplayObject不經受需要頻繁更新位圖的改動。換句話說,DisplayObject在某種程度上不改變外觀只是改變它在舞臺上的位置。如果頻繁更新位圖,性能會降低。
?
你可以經常改變位圖緩存,仍然可以看到性能上的收益,這取決于幾個因素,但不要太驚訝,最重要的因素是,你是如何經常改變位圖的。
?
無論如何,用MT類測試一個指定的工程,然后看看用位圖緩存和不用有什么差別。(當決定是否對那些不需要位圖改變的顯示對象使用位圖緩存時要不加思考的就使用!)
?
如果你有一個顯示對象(如影片剪輯),你想使用位圖緩存屬性,加上這句:
?
mc.cacheAsBitmap = true;
?
即使你改變顯示對象的大小、傾斜、透明度和或者旋轉(但不改變影片剪輯的幀數),然后發布到移動設備,使用位圖緩存也是能提升性能的。
?
尤其是,當把一個工程發布到移動設備時,你可以啟用cacheAsBitmap并分配catheAsBitmapMatrix屬性,完成后可大幅提升性能,像這樣:
?
mc.cacheAsBitmap = true;
mc.cacheAsBitmapMatrix = new Matrix();
?
不要使用默認單位矩陣。以后你就會知道有幾個原因促使你使用這個屬性而不是用默認矩陣。
?
Stage blitting(我不知道把它翻譯為“階段塊傳輸”還是“舞臺塊傳輸”)
?
這是一個描述數據傳輸的術語,包括了將使用的位圖最終渲染到顯示屏幕上。不是將顯示對象加到顯示列表里,而是把像素“放在”舞臺大小的位圖里,然后把位圖“加到”舞臺上。為了更新動畫,位圖的像素要在一個循環里更新。尤其是在Event.ENTER_FRAME循環里,使用BitmapData類里的copyPixel()方法,將舞臺大小的位圖里的BitmapData屬性,在動畫的循環之外替換其他的bitmapData對象。
?
這個方法比直接把對象放到顯示列表里復雜,但它更有效率——如果你有個沒法容忍的幀頻和需要高幀頻的Flash應用,這個方法會非常有用。誠然,除非你想增加幀頻,否則你絕對沒有理由使用這個方法。
?
我比較了一個SWF文件,它有10,000個正方形影片剪輯,執行運動和旋轉動作,還要穿過經過舞臺(可以看blit_test/blit_test_mc.fla范例)。然后我把這個文件做了一些基本的優化(可以看blit_test/blit_test_basic_optimizations.fla文件)和stage blitting(看blit_test/blit_test2文件)。
?
第一個SWF文件大概為15fps,這是不能容忍的。但是,在應用最難的技術優化比如塊傳輸之前,幾個基本的調整就可以輕松提高性能。
?
首先,我將循環倒序,這樣有了一點的性能提升(看下面循環的單元),然后,更重要的是,我使用一些常量取代了一些相同的但要重復計算的變量。這些調整時性能有了稍微大點的提升(約40%),讓幀頻可以稍微讓人接受點了,約21fps。
?
使用stage blitting編碼同樣的顯示區域,結果幀頻變成了54fps,整整提升了350%。
?
但是,正如我之前說的,這個技術的過程很復雜,包括下面幾個方面:
?
1.初始化需要在每個Event.ENTER_FRAME事件里循環的,要在舞臺上顯示的位圖資源(Bitmap實例,BitmapData實例和Rectangle實例)。
2.創建一個所有要顯示更新數據的數組。(這步不是必須的。)
3.創建一個BitmapData對象的數組。如果你的動畫在一個影片剪輯的時間軸上,這是你要每幀都存儲BitmapData對象的地方(例如,使用一個sprite列表,在范例文件夾里我為每個角度的矩形都創建了BitmapData實例,這個實例可以用AS旋轉。)
4.創建Event.ENTER_FRAME事件循環。
5.更新循環里的元素,將第3步里創建數組里相應的像素,復制到在第1步里創建BitmapData實例對應的地方(第2步決定使用data數組)。
?
想看更多細節,請看blit_test/blit_test2,它還包括額外的注釋。
?
Stage blitting技術的負面,不是復雜的編碼,而是也許在創建需要的位圖是消耗大量的內存。當為類似iPad之類有很高分辨率(第一、二代1024*768,第三代2048*1536),相對低的內存(RAM)和容量(一、二、三代分別為256MB,512MB和1GB)的設備寫應用時,這是個要嚴肅考慮的問題。
?
一般來說,你的游戲應消耗不多于一半的可用RAM。這指的是,不僅包括位圖而是你游戲里的一切消耗。
?
?
Partial blitting
?
正如字面含義,局部復制結合了Flash顯示列表和把像素復制到BitmapData對象兩種方式。特別是,在舞臺的每一個顯示對象是位圖時,把他們加入顯示列表,然后像一般的顯示對象比如影片剪輯那樣操控就行了。把每個對象的動畫復制到一個BitmapData對象的數組里。
?
?
?
例如,使用之前有正方形運動選擇穿過舞臺的文件例子,我把正方形和它們各種旋轉,將這些BitmapData對象存放在一個數組里,放在bitmap里加入顯示列表,然后在Event.ENTER_FRAME循環里操控這些bitmap就像操控任何顯示對象那樣(比如之前描述的影片剪輯)。最后,我將bitmap的bitmapData屬性分配給對應的數組元素。(看看這是如何實現的,可以復習blit_test/partial_blitting_test.fla文件。)
在我的電腦上,Partial blitting測試(24-26fps)不會像stage blitting一樣快。但是這個方法為你啟發了思路,因為也許在其他方面partial blitting比stage blitting快。另外,partial blitting比stage blitting好編碼。所以呢,如果你用partial blitting技術可以得到效果好的幀頻,那么它還可以減少在stage blitting里必須要做的額外工作。(就是如果能用局部復制就可以不用stage blitting了。)
?
?
?
有關Event.ENTER_FRAME 循環
?
?
?
在一個實例上,創建多個Event.ENTER_FRAME偵聽器,回調多個函數,要比一個實例上創建一個偵聽器回調一個函數,這個函數再調用其他函數,要稍微快那么一點點。(好繞口啊~~~~~~)
但是,這有個不同的情況:在多個對象上分別偵聽Event.ENTER_FRAME,和一個對象上偵聽一個相比較,使用一個對象偵聽一個是多個對象擁有各自偵聽器性能的大約兩倍。(可以看enterframe_test_one_v_many_loops_with_different_movieclips 文件夾下的例子。)
理解For循環,while循環和do循環
?
?
?
在Flash里,for的倒序循環是最快執行的循環。如果在循環里需要存儲的都是相同類型的對象,一個保存所有對象引用的,使用Vector的倒序for循環是最快的。
?
?
?
如果你使用int而不是uint來迭代元素,那這三個循環都執行的都挺快。如果你遞減循環變量而不是增加,那么三個循環也會一樣快。(注意:如果你遞減的循環變量i使用的中止條件是i>=0,并且i是uint的話,你可能會觸發一個沒有結束的循環。)
?
?
?
如果你使用的是變量或常量作為循環結束的標志而不是表達式或對象屬性,那么三個循環一樣快。因為初始條件僅需要評估一次(而不是每次循環迭代都要判斷),在任何循環里循環里,使用判斷式或對象屬性作為初始條件都沒有大的差別。
任何不會影響循環的內容都應該放到循環的外面。這包括在循環外定義對象(看重用對象的單元),有時在循環里使用新的構造函數可以放在循環外面,如果結束條件是個表達式,應該在循環外算出來。
我曾看過這種說法,對每一個有個下個對象引用的對象循環(類似鏈表),要比一個數組存儲所有對象引用的循環快。在我的測試結果顯示,這是不對的。
使用數組比先初始化再使用要快和容易。使用Vector而不是數組,當然要更快了。(見for_loop_v_sequential_loop 文件夾下的例子。)
所有的這些建議可能在很多情況下沒什么很大差別。但是,如果你的代碼要利用一切可以利用的資源,或者你的工程里有數量驚人的迭代,這些細節值得你參考。
禁用鼠標交互
?
影片剪輯和sprite可以和鼠標交互。即使你沒有為鼠標交互編任何代碼,當這些對象存在時Flash Player會檢查鼠標交互。所以你可以禁用一些不需要的交互拯救一點CPU資源。
?
?
?
當你注意到性能問題,鼠標滑過舞臺時(或者你的電腦風扇加快轉速),這個策略非常有用。禁用鼠標交互可以提升性能還可以讓你的電腦風扇安靜點。
在測試時,我看到當禁用所有影片剪輯的鼠標事件后,幀頻增加了2 1/2倍,這個測試代碼在mouse_interactivity 文件夾下。
移除事件偵聽器
?
?
?
即使最新版本的Flash Player出現了兩個功能:當對象被垃圾回收后移除偵聽器,和強引用偵聽器不再延遲垃圾回收。你仍然要盡可能明確地移除所有的事件偵聽器。偵聽器越是迅速的移除掉,被占用的CPU資源越少。另外,你可能不知道你裝了哪個版本的Flash Player,老版本是沒有垃圾回收對象的——即那些對象是弱引用偵聽器。不要依賴最新的Flash Player功能,而要踏實優化自己的糟糕代碼。
?
?
?
?
有關Stage3D
?
?
?
Stage3D是基于GPU的顯示渲染模型,它是Flash Player11版本發布的。這個模型對3D渲染特別有用,但是使用例如Starling的框架也能服務于2D顯示。
?
?
?
因為原本CPU承擔了全部的渲染顯示工作,(當運行一個程序時CPU也要做其他工作),而現在GPU承擔了一部分渲染工作,就可以讓CPU有更多的空閑做其他工作。這樣的利用極大的提高了設備性能。
?
?
?
想看Stage3D內容,你必須使用Flash Player11或更高版本。想看Stage3D的API,你需要用Flash Player11或更高版本發布SWF文件。如果你使用Flash Professional CS6工作,那它已經全部設置好了。如果你用的是Flash Professional CS5或CS5.5,你可以更新Flash安裝文件使之可以發布Flash Player11。更多的細節,可以看Rich Galvan寫的名為Adding Flash Player 11 support to Flash Professional CS5 and CS5.5博客。
?
很不幸,使用Stage 3D的API非常困難。但是,有幾個免費開源的框架可以生成使用Stage 3D所需的最基本的代碼。
?
?
?
其中之一就是Starling,被用來開發2D游戲。它簡單易學并且高效簡化了Stage3D的復雜性。Starling?的API可以在Starling框架參考網站里尋找。
?
?
?
我測試了Starling來看它和blitting、partial blitting相比較如何。在某些情況下,Starling表現的比這兩種blitting要不好。事實上,他表現的比沒有優化的10,000個正方形影片剪輯的測試還要糟糕。
?
?
?
但是,在Starling測試里,如果你不選擇允許編譯選項,那么這小小的改變可以使幀頻快兩倍,輸出的SWF文件可以比得上沒有優化的10,000個正方形測試。但是這個結果依然讓人失望,部分的問題在于,我使用編譯版本的Flash Player來測試時,在編譯和不編譯兩種情況下,Starling在編譯情況下表現的不好。
?
?
?
另外,10,000個正方形影片剪輯測試不能顯示出Starling最好的一面。如果你使用許多包含各自時間軸動畫的影片剪輯,Starling會比幾乎任何你使用的簡單優化技術要出色。
?
?
?
僅僅blitting優化的性能就要優于使用Stage3D和Starling所帶來的收益。但是blitting也許不是那么實用,因為內存需要創建所需的位圖。
?
?
?
范例文件在starling_test 文件夾下。
使用Starling框架時,要遵循以下步驟:
?
?
?
1.下載Starling.swc文件。
?
2.使用以下步驟將它導入你的Flash工程鏈接庫:
?
1)選擇,文件>發布設置>腳本設置。
?
2)點擊庫路徑選項卡,然后點擊瀏覽,選擇你下載好的swc文件的位置路徑。
?
3)在“打開文件”對話框,選擇你放swc文件的路徑。
?
4)點擊“打開”,添加starling.swc到你的鏈接庫路徑。
?
5)點擊OK關閉高級ActionScript 3.0設置面板,然后再次點擊OK關閉發布設置。
?
6)保存Fla文件,你就可以使用Starling了。
?
(我一般都是在builder里導入和使用的,估計這里有人看了會迷茫,我翻譯的不是太好,自己多選兩次就知道了,讓我偷個懶吧!)
?
?
?
如果你用Stage3D發布移動air游戲(它包括了類似Starling的框架來使用Stage3D),可以設置渲染模式來指導。如果你發布的是內置HTML文件,可在發布設置里設置窗口模式進行指導。
?
?
?
你可以在Adobe Gaming site學習更多有關Starling和Stage3D API的信息。
?
?
?
下一步
除上面所討論的優化技術外,開發Flash項目要提高重放性能時,還有另外兩種你可以使用的最佳實踐技術:
?
?
?
1.為你聲明的每個變量確定類型,如果你肯花時間確定所有變量的類型,代碼會執行的更快,當遇到錯誤時,編譯顯示的錯誤信息也更具描述性和幫助性。可以查看測試范例variables_typed_v_untyped。
2.使用Vector而不是array來存儲數據信息。為了看到它的性能,可以看array_v_vector文件。
?
希望這篇文章的推薦的大綱可以幫你提高在Flash Professional里創建工程的性能。想要學習更多有關建立Flash動畫,應用和游戲的信息,可以訪問Flash Developer Center。
?
?
轉載于:https://www.cnblogs.com/janas/p/3901713.html
總結
以上是生活随笔為你收集整理的[转]优化Flash性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 甩渣 自带价
- 下一篇: 猪血煮豆腐下一句是什么啊?