其實as3這個坑我早就踩過,不過那時沒太注意,最近把項目的removeChild干掉換成了visible=false,發現效率質的提升……
先貼一下代碼吧
private function testRemoveChild():void { var startTime:int = getTimer(); var count:int = 9999; for (var i:int = 0; i < count; i++) { var sp:Sprite = new Sprite(); addChild(sp); } trace("創建對象計算用時",getTimer()-startTime,"毫秒"); startTime = getTimer(); while(this.numChildren) this.removeChildAt(this.numChildren-1);; // while(this.numChildren) // this.removeChildAt(0); trace("移除對象計算用時",getTimer()-startTime,"毫秒"); }
輸出
創建對象計算用時 95 毫秒
移除對象計算用時 4317 毫秒
這個測試很簡單,不過卻看出一點,如果場景上有對象進進出出的話……光removeChild就吃掉了一截cpu。adobe這吭一直到現在都沒填好,也不怪蘋果說它懶了。
為了解決removeChild吃性能的問題,我用了visible=false+對象池代管理來解決。發現fps確實提高了,但是真正的解決還需要一個條件就是flash player10.3……
上一張論壇里找到一帖子,原話是這樣的
"話說 AS3 中,在舞台外的某顯示對象的 visible 設為 false,之后其是否還會被重繪的問題,發現有不少兄弟還搞不太清。 故在此做下說明:Flash Player 10.3 以前的版本仍然會重繪,10.3 以后的版本就不會再被重繪了。請大家注意!"
最后我總結一個提高性能的方案,用LRU對象池+visible=false管理,完美提高運行效率。