Re: [情報] Object pool - 增加程式效能的技巧

看板Flash作者 (CJ Cat)時間17年前 (2008/12/16 02:22), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串2/2 (看更多)
我自己寫了一個Pool class 然後做了一個小實驗 結果發現 先一口氣大量宣告Sprite到pool裡面,以供未來提用 的確比每次要用到新的Sprite之後才new一個出來快非常多 以下面的例子來說 import idv.cjcat.ds.*; var count:int = 10000; //使用Pool class var p:Pool = new Pool(Sprite, count); var i:int; for (i = 0; i < count; i++) addChild(p.get() as Sprite); //不使用Pool class for (i = 0; i < count; i++) addChild(new Sprite()); 利用trace()和getTimer() 我得到兩種將10000個Sprite加到場景上的方法所需的時間 使用我的Pool class花了2220毫秒 而不使用的話則花了9797毫秒 差了超過四倍 不只如此 如果將使用過的物件用recycle()丟回pool再存起來 以後再提取這些物件 這樣一來,兩種方法的執行時間又差更多了 (改成生成6000個Sprite,因為生成10000個Sprite不用Pool會花太多時間) var count:int = 6000; //使用Pool var p:Pool = new Pool(Sprite, count); var i:int; for (i = 0; i < count; i++) addChild(p.get() as Sprite); for (i = 0; i < count; i++) p.recycle(removeChildAt(0)); for (i = 0; i < count; i++) addChild(p.get() as Sprite); //不使用Pool for (i = 0; i < count; i++) addChild(new Sprite()); for (i = 0; i < count; i++) removeChildAt(0); for (i = 0; i < count; i++) addChild(new Sprite()); 利用trace()和getTimer()得到的執行時間 使用Pool的方法花了1297毫秒 不使用Pool的話則花了10151毫秒 差了快要10倍! 看來Object pool的威力的確不容小覷... P.S. 我的Pool class可以在最新的CJLibrary CS4中找到 http://code.google.com/p/cjlibrarycs4 -- CJ Cat = Croa'J Cat = Cockroach Cat = 西街凱特 = 蜚蠊貓 = 蟑螂貓 Blog http://cjcat.blogspot.com Gallery http://cjcat2266.deviantart.com ptt2 Board CJWorkshop - 阿多比閃光(Adobe Flash)研討區 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.88.104 ※ 編輯: cjcat2266 來自: 61.228.88.104 (12/16 02:26)

12/16 02:29, , 1F
12/16 02:29, 1F
※ 編輯: cjcat2266 來自: 61.228.88.104 (12/16 02:41)

12/16 02:41, , 2F
感謝,已修正 :)
12/16 02:41, 2F

12/16 23:24, , 3F
效能差別真明顯
12/16 23:24, 3F
文章代碼(AID): #19Hg23jl (Flash)
文章代碼(AID): #19Hg23jl (Flash)