首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Box2d物理模拟卡顿

Box2d物理模拟卡顿
EN

Stack Overflow用户
提问于 2012-06-02 09:19:55
回答 1查看 312关注 0票数 0

我有一些代码,这些代码在调用一次之后会导致box2d物理模拟永远卡顿。我在上面运行了一个性能测试,OSSpinLockLock在上面花了很多时间。解决方案和其他一些box2d函数会占用很多时间。我不太清楚这是怎么回事。在静态物体重叠较多的贴图上,这一效果似乎比静态物体重叠较少的贴图更差。导致卡顿的代码如下:

代码语言:javascript
复制
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对象会减慢物理模拟的速度吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-15 08:01:49

造成这个问题的原因是,代码给所有距离超过最大距离的身体一个小的轻击,使其接近爆炸。我真的不确定为什么这会导致物理模拟卡顿,但是添加了一个continue语句来代替distance = maxDistance - 0.01;解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10859095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档