2013-08-05 117 views
0

我有一個預定的功能,檢查身體之間的聯繫,這是每幀調用。for loop in contact listener drop FPS?

當我想檢查某個CCSpriteb2body之間的觸摸時,我首先檢查它們是否存在於屏幕上,比我在相關類型的所有精靈上運行for循環。所以,如果我有3只狗,我想檢查接觸,我必須在屏幕上運行所有狗精靈的每個幀。 問題是,我可以看到它減少我的FPS,使遊戲有點模糊。在許多精靈觸點(堆棧幀)

如何運行和降不下來的FPS?

//in my contact check that relevant sprites are exist,than check contact 
    if([self getChildByTag:1] && [self getChildByTag:300]) 
      { 
       // run on 10 sprites and check contact 
       for(int i=0;i<10;i++) 
       { 
        if(CGRectIntersectsRect ([[self getChildByTag:300+i] boundingBox], [sprite boundingBox])) 
        //do something 
        } 

所以即使沒有接觸,只有我檢查幀速率這麼多的條件導致一些泄漏的事實。

回答

2

getChildByTag枚舉子數組以查找具有匹配標記的第一個節點。如果這些節點碰巧接近兒童陣列的末端,並且有很多孩子,這就浪費了很多性能。

將這些300 + i節點存儲在單獨的數組中並使該數組可通過屬性訪問可能會更好。

您還應該在本地存儲sprite boundingBox,而不是在每次迭代中發送boundingBox消息。

此外,您將在上運行此代碼,每聯繫事件!當10個物體相互接觸時,相同的代碼運行10次。至少。因爲在某些情況下,contactBegan可能會被稱爲每個聯繫人每幀多次(如果他們有多個聯繫點我相信)。

它也提出了一個問題:爲什麼當你已經有兩個接觸體時使用CGRectIntersectsRect?這似乎是多餘的,除非你試圖測試非物理機構的聯繫。