0

我有一个预定的函数来检查身体之间的接触,每帧都被调用。

当我想检查某个CCSprite和之间的触摸时b2body,我首先检查它们是否存在于屏幕上,然后,我在相关种类的所有精灵上运行 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
                  }

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

4

1 回答 1

2

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

您最好将这 300+i 个节点存储在一个单独的数组中,并通过属性使该数组可访问。

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

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

它也引出了一个问题:当你已经有两个接触体时,为什么还要使用 CGRectIntersectsRect 呢?这似乎是多余的,除非你试图测试非物理物体的接触。

于 2013-08-05T12:05:38.193 回答