我有一些代码会导致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));
}
}
我怀疑ApplyLinearImpulse部分是导致口吃的原因,因为它是唯一与物理相关的东西。我只是评论了整个循环,口吃从未到来。但是一旦我用相同的代码爆炸了一些其他爆炸物,口吃就来了。重叠的静态b2body对象会减慢物理模拟的速度吗?
答案 0 :(得分:0)
这个问题是由于代码给出的所有物体都比最大距离更远,只有一小部分朝向爆炸。我不确定为什么这会导致物理模拟断断续续,但添加一个continue语句来代替distance = maxDistance - 0.01;解决了这个问题。