欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

flex 優(yōu)化技巧 收集[提升性能]

 更新時(shí)間:2009年05月25日 18:29:33   作者:  
非常不錯(cuò)的flex優(yōu)化技巧 37篇
1、當(dāng)創(chuàng)建一個(gè)數(shù)組的時(shí)候避免用new操作符,用 var a:Array = [];而不用var a:Array = new Array();
2、快速的復(fù)制一個(gè)數(shù)組:
var copy : Array = sourceArray.concat ();
3、設(shè)置一個(gè)數(shù)組的值是非常忙的:
employees.push ( employee ); employees[2] = employee;
4、從一個(gè)數(shù)組中取得值的速度是設(shè)置一個(gè)數(shù)組值的兩倍快:
var employee : Employee = employees[2];
5、當(dāng)不需要一個(gè)類(lèi)的實(shí)例的時(shí)候盡量用靜態(tài)的屬性或方法:
StringUtils.trim( "text with space at end " );
Class definition: package {
public final class StringUtils {
public static function trim( s : String ) : String {
var trimmed : String ; // implementation...
return trimmed;
}
}
}
6、在整個(gè)程序的生命周期中都不會(huì)改變的變量用const定義常量:
public const APPLICATION_PUBLISHER : String = "Company, Inc. ";
7、當(dāng)一個(gè)類(lèi)不需要有子類(lèi)的時(shí)候應(yīng)該將該類(lèi)聲明為final類(lèi)型的:
public final class StringUtils
8、變量和方法的長(zhǎng)度在As3中并不影響什么性能,但在別的語(yǔ)言中可能就有影響: someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch();
9、將語(yǔ)句寫(xiě)在一行上面并不會(huì)影響AS3程序的性能,但在別的語(yǔ)言中卻有影響:
var i=0; j=10; k=200;
10、在內(nèi)存占用上面if語(yǔ)句和switch語(yǔ)句并沒(méi)有什么區(qū)別:
語(yǔ)句:
if ( condition ) {
// handle condition
}
和語(yǔ)句:
switch ( condition ) {
case "A ": // logic to handle case A break ;
case "B ": // logic to handle case B break ;
}
占用的內(nèi)存是一樣的.
11、當(dāng)你的程序處理分支較多的時(shí)候,你應(yīng)該適當(dāng)?shù)呐帕兴麄兂霈F(xiàn)的順序,可以參照以下的方式進(jìn)行:
if ( conditionThatHappensAlot ) {
//處理經(jīng)常發(fā)生的業(yè)務(wù)邏輯
} else if ( conditionThatHappensSomtimes ) {
// 處理偶爾會(huì)發(fā)生的業(yè)務(wù)邏輯
} else {
// 處理幾乎不會(huì)發(fā)生的情況
}
12、Actionscript虛擬機(jī)(Flash Player)推薦在循環(huán)內(nèi)部用int而不是number,但是flash Player10在flash Player9的基礎(chǔ)上做了很多的改進(jìn),int,uint和number之間的轉(zhuǎn)換不在像以前那么慢了。
13、每個(gè)變量都應(yīng)該聲明一個(gè)確定的類(lèi)型,解決那些沒(méi)有指定類(lèi)型的警告信息活錯(cuò)誤信息。
14、盡量少用unint,它可能會(huì)非常慢,但是Flashplayer10做了改進(jìn),速度不像以前那么慢了:
var footerHex : uint = 0x00ccff;
15、循環(huán)遍歷的時(shí)候用int類(lèi)型:
for (var i: int = 0; i < n; i++)
而不用:
for (var i: Number = 0; i < n; i++)
16、在用decimal的時(shí)候用number而不用int:
var decimal : Number = 14.654;
而不用:
var decimal : int = 14.654;
17、用乘法代替除法:
用100*0.01代替100/100
18、在for和while循環(huán)中用到的計(jì)算應(yīng)事先聲明好,而不是在循環(huán)中重復(fù)聲明.
for (..){ a * 180 / Math .PI ; } 應(yīng)該在循環(huán)的外部申明: toRadians = a*180/Math .PI ;
19、避免在循環(huán)中調(diào)用方法或計(jì)算:
var len : int = myArray.lengh; for (var i=0;i<len;i++){}
而不要用:
for (var i=0;i< myArray.lengh;i++){ }
20、用正則表達(dá)式進(jìn)行字符串的校驗(yàn),用String的方法進(jìn)行字符串的查找:
// postal code validation example using regular expressions
private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
private function validatePostal( event : Event ) : void {
if ( regEx.test( zipTextInput.text ) ) {
// handle invalid input case
}
}
// search a string using String methods
var string : String = "Search me ";
var searchIndex : int = string.indexOf ( "me " );
var search : String = string.substring ( searchIndex, searchIndex + 2 );
21、重復(fù)使用諸如DisplayObjects和URLLoaderReuse之類(lèi)的物體,以保持"內(nèi)存平穩(wěn)".
22、使用組件或創(chuàng)建自定義組件時(shí)應(yīng)遵循Flex的組件模型,如下面的方法為組件創(chuàng)建時(shí)應(yīng)先后調(diào)用的方法.
createChildren(); commitProperties(); updateDisplayList();
23、盡量少用dataGrid這樣的重量級(jí)的組件,除非你用一個(gè)常規(guī)的list無(wú)法實(shí)現(xiàn)你要的功能。
24、避免用Repeater 控件創(chuàng)建scrollable數(shù)據(jù).
25、盡量避免使用setStyle()方法,這個(gè)方法在Flex框架里面是眾多代價(jià)敖貴的方法之一。
26、當(dāng)你用過(guò)多的容器嵌套的時(shí)候會(huì)較低應(yīng)用程序的性能:
<mx:Panel>
<mx:VBox>
<mx:HBox>
<mx:Label text ="Label 1 " />
<mx:VBox> <mx:Label text ="Label 2 " />
</mx:VBox>
<mx:HBox>
<mx:Label text ="Label 3 " />
<mx:VBox>
<mx:Label text ="Label 4 " />
</mx:VBox>
</mx:HBox>
</mx:HBox>
</mx:VBox>
</mx:Panel>
27、沒(méi)有必要每次都用容器組件作為你自定義組件的父控件:
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml " source="avatar.jpg " width ="200 " height ="200 " />
28、減少不必要的容器嵌套
29、不要在Panel中vBox和HBox,用Panel的Layout屬性就可以了
30、不要在application標(biāo)簽下用HBox,和Vbox,道理和29一樣
31、設(shè)置recycleChildren為true來(lái)提高Repeater的性能 (重用已經(jīng)創(chuàng)建過(guò)的children而不是重新創(chuàng)建一個(gè)新)
<mx:Script>
<![CDATA[
[Bindable]
public var repeaterData : Array = ["data 1 ", "data 2 "];
]]>
</mx:Script>
<mx:Repeater id="repeater " dataProvider="{repeaterData} ">
<mx:Label text ="data item: {repeater.currentItem} "/>
</mx:Repeater>
32、將應(yīng)用程序的幀率設(shè)置為60fps或者更低:
<?xml version ="1.0 " encoding="utf-8 "?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml frameRate="45 ">
</mx:Application >
33、避免每一幀進(jìn)行過(guò)多的顯示操作.
34、能用ENTER_FRAME事件就不用Timer事件.
public function onEnterFrame ( event : Event ) : void { }
private function init () : void {
addEventListener( Event.ENTER_FRAME, onEnterFrame );
}
而不用:
public function onTimerTick( event : Event ) : void { }
private function init () : void {
var timer : Timer = new Timer();
timer.start ();
timer.addEventListener( TimerEvent.TIMER, onTimerTick );
}
35、在多幀上面通過(guò)以下方式延遲物體的創(chuàng)建.
<mx:Container creationPolicy="queued "/>
36、Alpha = 0并不是visible = false (設(shè)置為invisible的物體會(huì)被忽略,不作任何處理)
loginButton.visible = false ;
而不用:
loginButton.alpha = 0;
37、性能優(yōu)化:
內(nèi)存釋放優(yōu)化原則
1. 被刪除對(duì)象在外部的所有引用一定要被刪除干凈才能被系統(tǒng)當(dāng)成垃圾回收處理掉;
2. 父對(duì)象內(nèi)部的子對(duì)象被外部其他對(duì)象引用了,會(huì)導(dǎo)致此子對(duì)象不會(huì)被刪除,子對(duì)象不會(huì)被刪除又會(huì)導(dǎo)致了父對(duì)象不會(huì)被刪除;
3. 如果一個(gè)對(duì)象中引用了外部對(duì)象,當(dāng)自己被刪除或者不需要使用此引用對(duì)象時(shí),一定要記得把此對(duì)象的引用設(shè)置為 null;
4. 本對(duì)象刪除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子刪不掉導(dǎo)致父親也刪不掉;
5. 除了引用需要?jiǎng)h除外,系統(tǒng)組件或者全局工具、管理類(lèi)如果提供了卸載方法的就一定要調(diào)用刪除內(nèi)部對(duì)象,否則有可能會(huì)造成內(nèi)存泄露和性能損失;
6. 父對(duì)象立刻被刪除了不代表子對(duì)象就會(huì)被刪除或立刻被刪除,可能會(huì)在后期被系統(tǒng)自動(dòng)刪除或第二次移除操作時(shí)被刪除;
7. 如果父對(duì)象 remove 了子對(duì)象后沒(méi)有清除對(duì)子對(duì)象的引用,子對(duì)象一樣是不能被刪除的,父對(duì)象也不能被刪除;
8. 注冊(cè)的事件 如果沒(méi)有被移除不影響自定義的強(qiáng)行回收機(jī)制,但有可能會(huì)影響正常的回收機(jī)制,所以最好是做到注冊(cè)的事件監(jiān)聽(tīng)器都要記得移除干凈。
9. 父對(duì)象被刪除了不代表其余子對(duì)象都刪除了,找到一種狀態(tài)的泄露代碼不等于其他狀態(tài)就沒(méi)有泄露了,要各模塊各狀態(tài)逐個(gè)進(jìn)行測(cè)試分析,直到測(cè)試任何狀態(tài)下都能刪除整個(gè)對(duì)象為止。
內(nèi)存泄露舉例 :
1. 引用泄露:對(duì)子對(duì)象的引用,外部對(duì)本對(duì)象或子對(duì)象的引用都需要置 null ;
2. 系統(tǒng)類(lèi)泄露:使用了系統(tǒng)類(lèi)而忘記做刪除操作了,如 BindingUtils.bindSetter() , ChangeWatcher.watch() 函數(shù) 時(shí)候完畢后需要調(diào)用 ChangeWatcher.unwatch() 函數(shù)來(lái)清除引用 ,否則使用此函數(shù)的對(duì)象將不會(huì)被刪除;
類(lèi)似的還有 MUSIC , VIDEO , IMAGE , TIMER , EVENT , BINDING 等。
3. 效果 泄露:當(dāng)對(duì)組件應(yīng)用效果 Effect 的時(shí)候,當(dāng)本對(duì)象本刪除時(shí)需要把本對(duì)象和子對(duì)象上的 Effect 動(dòng)畫(huà) 停止掉,然后把 Effect 的 target 對(duì)象置 null; 如果不停止掉動(dòng)畫(huà)直接把 Effect 置 null 將不能正常移除對(duì)象。
4. SWF 泄露:要完全刪除一個(gè) SWF 要調(diào)用它的 unload() 方法并且把對(duì)象置 null;
5. 圖片泄露:當(dāng) Image 對(duì)象使用完畢后要把 source 置 null;( 為測(cè)試 ) ;
6. 聲音、視頻 泄露 : 當(dāng)不需要一個(gè)音樂(lè)或視頻是需要停止音樂(lè),刪除對(duì)象,引用置 null;
內(nèi)存泄露解決方法:
1. 在組件的 REMOVED_FROM_STAGE 事件回掉中做垃圾處理操作(移除所有對(duì)外引用(不管是 VO 還是組件的都需要?jiǎng)h除),刪除監(jiān)聽(tīng)器,調(diào)用系統(tǒng)類(lèi)的清除方法)
先 remove 再置 null, 確保被 remove 或者 removeAll 后的對(duì)象在外部的引用全部釋放干凈 ;
2. 利用 Flex 的性能優(yōu)化工具 Profile 來(lái)對(duì)項(xiàng)目進(jìn)程進(jìn)行監(jiān)控,可知道歷史創(chuàng)建過(guò)哪些對(duì)象,目前有哪些對(duì)象沒(méi)有被刪除,創(chuàng)建的數(shù)量,占用的內(nèi)存比例和用量,創(chuàng)建過(guò)程等信息 ;

相關(guān)文章

最新評(píng)論