Box2D的可变时间步错误

时间:2012-08-09 19:05:12

标签: optimization cocos2d-iphone box2d physics intervals

任何人都可以发现下面的代码有什么问题。它应该平均前一个TIME_STEPS帧数的帧间隔(dt)。

我正在使用Box2d和cocos2d,虽然我不认为cocos2d位非常相关。

-(void) update: (ccTime) dt
{
    float32 timeStep;
    const int32 velocityIterations = 8;
    const int32 positionIterations = 3;

    // Average the previous TIME_STEPS time steps

    for (int i = 0; i < TIME_STEPS; i++)
    {
        timeStep += previous_time_steps[i];
    }

    timeStep = timeStep/TIME_STEPS;

    // step the world
    [GB2Engine sharedInstance].world->Step(timeStep, velocityIterations, positionIterations);

    for (int i = 0; i < TIME_STEPS - 1; i++)
    {
        previous_time_steps[i] = previous_time_steps[i+1];
    }

    previous_time_steps[TIME_STEPS - 1] = dt;
}

previous_time_steps数组最初也会填充设置动画间隔的任何内容。

这不符合我的预期。在具有低帧速率的设备上,它可以加速模拟,在具有高帧速率的设备上,它可以减慢速度。我确定这是我看起来很蠢的东西。

我知道box2D喜欢使用固定时间步骤,但我真的没有选择。我的游戏在各种设备上以非常可变的帧速率运行,因此固定的时间停止不起作用。游戏的平均运行速度为40 fps,但在第一代iPad等一些较为疯狂的设备上,它的运行速度仅为每秒30帧。第三代ipad以每秒50/60帧的速度运行。

我也对其他处理这个问题的方法提出建议。任何建议将不胜感激。

还有其他不寻常之处我应该注意到,有人可能会深入了解在构建上运行任何调试优化对上述情况产生巨大影响的事实。当调试优化设置为-Os vs -O0时,帧速率不会发生太大变化。但是当首次亮相优化被设置为-Os时,当上述代码处于活动状态时,物理模拟的运行速度比-O0快得多。如果我只使用dt作为间隔而不是上面的代码,则调试优化没有任何区别。

我对此完全感到困惑。

1 个答案:

答案 0 :(得分:1)

  

在帧速率较低的设备上,可加快模拟速度   具有高帧速率的设备会降低它的速度。

使用可变时间步长的是什么。如果你只获得10 fps,物理引擎将更快地迭代世界,因为增量时间更长。

PS:如果您进行任何类似的性能测试,请使用发布版本运行它们。这还可确保禁用(大多数)日志记录并启用代码优化。您可能只是通过在旧设备上调试代码而对性能产生更大的影响。

此外,TIME_STEPS的值是多少?它不应该超过10,最多可能是20。平均的替代方法是直接使用增量时间,但如果增量时间大于某个阈值(30 fps),请切换到使用固定增量时间(上限)。因为低于30 fps的可变时间步长可能变得非常丑陋,在这种情况下可能更好的是允许物理引擎以帧速率减速,否则如果在较低的fps下无法播放则游戏将变得更难。