Objective c Box2d物理模拟口吃

Objective c Box2d物理模拟口吃,objective-c,optimization,box2d,Objective C,Optimization,Box2d,我有一些代码,在这个代码被调用一次之后,会导致box2d物理模拟永远结巴。我对它进行了性能测试,OSSpinLockLock在这方面花费了很多时间。b2Island::Solve和其他一些box2d函数导致此操作占用了大量时间。我真的不确定这里发生了什么。这对具有更多重叠静态实体的贴图的影响似乎比具有较少重叠静态实体的贴图更糟糕。导致口吃的代码如下: for (b2Body*b = currentWorld->GetBodyList(); b!=nil; b = b->GetNext

我有一些代码,在这个代码被调用一次之后,会导致box2d物理模拟永远结巴。我对它进行了性能测试,OSSpinLockLock在这方面花费了很多时间。b2Island::Solve和其他一些box2d函数导致此操作占用了大量时间。我真的不确定这里发生了什么。这对具有更多重叠静态实体的贴图的影响似乎比具有较少重叠静态实体的贴图更糟糕。导致口吃的代码如下:

for (b2Body*b = currentWorld->GetBodyList(); b!=nil; b = b->GetNext()) {



    float distance = 0;
    float strength = 0;
    float force = 0;
    float angle = 0;

    CGPoint curPos = [Helper toPixels:b->GetWorldCenter()];

    distance = ccpDistance(selfPos, curPos);
    if (distance>maxDistance) {
        distance = maxDistance - 0.01;
    }

    //strength = (maxDistance - distance) / maxDistance;
    strength = (distance - maxDistance)/maxDistance;
    force = strength * maxForce;
    angle = atan2f(selfPos.y - curPos.y, selfPos.x - curPos.x);
    //b2Vec2 forceVec = [Helper toMeters:force];

    //CCLOG(@"strength = %f force = %f angle = %f distance = %f",strength,angle,force, distance);
    b->ApplyLinearImpulse(b2Vec2(cosf(angle) * force, sinf(angle) * force), b->GetPosition());
    BodyNode * bn = (BodyNode*)b->GetUserData();
    if ([bn isKindOfClass:[Soldier class]]) {
        ((Soldier*)bn).health-=abs(force*(damage * kRocketDamageFactor)); //used to be 50
    }
    if ([bn isKindOfClass:[BaseAI class]]) {
        ((BaseAI*)bn).health-=abs(force*(damage * kRocketDamageFactor));
    }
    if ([bn isKindOfClass:[BaseLevelObject class]]) {
        if (((BaseLevelObject*)bn).takesDamageFromBullets == YES) {
            ((BaseLevelObject*)bn).health-=abs(force*(damage * kRocketDamageFactor));
        }

    }

我怀疑applylinearpulse部分是导致口吃的原因,因为它是唯一与物理有关的东西。我刚刚把整个循环都注释掉了,口吃就再也没有了。但当我用同样的密码引爆其他炸药时,口吃就来了。重叠的静态物体是否会减慢物理模拟的速度?

该问题是由代码导致的,该代码使所有距离超过最大距离的物体朝爆炸方向轻轻敲击。我不太清楚为什么这会导致物理模拟结巴,但添加了一个continue语句来代替distance=maxDistance-0.01;已解决问题。

已确认。是applylinearpulse函数导致了抖动。我运行了另一个性能测试,我确信与抖动相关的进程是b2PairLessThan(b2Pair const&,b2Pair const&)。当抖动不存在时,这个过程甚至不会出现在前50名左右。导致抖动的代码(上面的大样本)是从b2ContactListener的BeginContact函数调用的。