一個方法告訴你as3的removeChild性能有多爛


其實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管理,完美提高運行效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM