for contact in contact listener drop FPS?

时间:2013-08-05 11:49:43

标签: objective-c cocos2d-iphone

我有一个预定的函数,用于检查正在每个帧调用的实体之间的联系。

当我想检查某个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
                  }

所以即使没有接触,只有我检查帧速率这么多条件的事实会导致一些泄漏。

1 个答案:

答案 0 :(得分:2)

getChildByTag枚举children数组以查找具有匹配标记的第一个节点。如果这些节点碰巧接近子数组的末尾并且有很多子节点,则会浪费很多性能。

最好将这些300 + i节点存储在一个单独的阵列中,并通过属性访问该阵列。

您还应该在本地存储sprite boundingBox,而不是在每次迭代中发送boundingBox消息。

此外,您将在每次联系活动中运行此代码!当10个物体彼此接触时,相同的代码运行10次。至少。因为在某些情况下,每个接触体每个帧可以多次调用contactBegan(如果它们有多个接触点,我相信)。

这也引出了一个问题:当你已经拥有两个联系机构时,为什么要使用CGRectIntersectsRect?这似乎是多余的,除非你试图测试非物理机构的联系。