0

任何人都可以发现下面的代码有什么问题。它应该对前一个 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 与 -O0 时,帧速率没有太大变化。但是,当首次优化设置为 -Os 时,当上述代码处于活动状态时,物理模拟的运行速度比 -O0 快得多。如果我只是使用 dt 作为间隔而不是上面的代码,那么调试优化没有任何区别。

我对此完全感到困惑。

4

1 回答 1

1

在具有低帧速率的设备上,它会加快模拟速度,而在具有高帧速率的设备上,它会减慢模拟速度。

这就是使用可变时间步长的意义所在。如果您仅获得 10 fps,则物理引擎将更快地迭代世界,因为增量时间更大。

PS:如果您进行任何类型的性能测试,请使用发布版本运行它们。这也确保了(大多数)日志记录被禁用并且代码优化被打开。在旧设备上调试代码时,您可能会体验到更大的性能影响。

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

于 2012-08-09T20:58:29.047 回答