2011-07-19 24 views
0

我被困在這一個。我正在製作一款遊戲。我使用這段代碼來創造一些令人失望的債務。當一個物體被摧毀時,我會產生一些碎石,讓它飛過屏幕。但是......當我使用這個很多的時候,減速就在那裏,即使所有的對象都沒有了,放慢速度仍然存在。好老50fps的不會再回來了:(有沒有在這裏某種memoryleak的我失蹤?還是有更好的方式來做到這一點?使用和移除很多對象後,慢慢停留

public function destroyBlock(xPos,yPos,nrObjects) { 

     for (var debree = 0; debree < nrObjects; debree++) { 

      debreeObject = new mc_ground(); 
       debreeObject.x = xPos; 
       debreeObject.y = yPos; 
       debreeObject.scaleX = Math.random() * 0.3 + 0.1; 
       debreeObject.scaleY = debreeObject.scaleX; 
       debreeObject.speedX = Math.random()* 5 - 2.5; 
       debreeObject.speedY = -Math.random() * 10 - 5; 
      stageObject.addChild(debreeObject); 

      debreeObject.addEventListener(Event.ENTER_FRAME, moveDebree); 

     } 

    } 

    public function moveDebree(e:Event) { 

     e.target.x += e.target.speedX; 

     e.target.y += e.target.speedY; 
     e.target.speedY += gravity; 

     if (e.target.y > stageHeight) { 

      e.target.removeEventListener(Event.ENTER_FRAME, moveDebree); 
      e.target.parent.removeChild(e.target); 
     } 

    } 
+0

您是否驗證過由該循環創建的等量對象實際通過'if(e.target.y> stageHeight){..}'? – Bakapii

+0

是的,我嘗試了另一種方式,比如淡化對象的alpha,然後使用if(e.target.alpha == 0)來移除對象。一樣。 –

+0

驗證此IF聲明如果(e.target.y> stageHeight)我有一種感覺,你沒有得到一個好stageHeight –

回答

1

我測試你的代碼,我可以」看不到任何性能損失。你確定這是不是因爲你的遊戲的其他部分?

Your code only on wonderfl

+0

+1爲wonderfl :) – pkyeck

+0

感謝很多人,這太奇怪了。我仍然有這個問題,所有的測試都表明問題在於此。我測試了不同的選項。也許這不是一般的代碼。難道當閃光燈在屏幕上的許多物體減速時不能達到它的舊速度了嗎?對我來說這沒有問題,但它有點不可思議,不是嗎? –

+0

還是...當我做極端的事情(使用這段代碼的數千個對象)並去調試 - >列出對象時,它顯示了我關於22670個對象的信息。所以一定有東西留在那裏。我會再測試一些。 –

0

我建議實施一個Object Pool這種類型的活動。因爲創建new mc_ground()對象將慢下來特別是在循環中,內存分配和釋放可能很慢;在任何給定的時間都會記憶很多東西。

一旦你的池創建,然後你可以做一些像這會給你一個池中的對象。然後在對該對象調用removeChild後,將其返回到類似myDebreePool.returnToPool(oldDebreeObject)之類的池中。

根據您的需要,您可能需要對象池在您返回時重置對象的狀態。否則,它可能會記住不再需要的舊數據。但是,考慮到您的示例代碼,我不認爲這是必要的。

如果您正確實現了對象池,那麼在此類場景中應該會看到顯着的性能提升。

+0

謝謝,我會研究這個。 –