Optimization Box2D的可变时间步长错误

Optimization Box2D的可变时间步长错误,optimization,cocos2d-iphone,box2d,physics,intervals,Optimization,Cocos2d Iphone,Box2d,Physics,Intervals,有人能发现下面的代码有什么问题吗。它应该平均前一时间的帧间隔(dt)和帧数 我使用的是Box2d和cocos2d,尽管我认为cocos2d位不是很相关 -(void) update: (ccTime) dt { float32 timeStep; const int32 velocityIterations = 8; const int32 positionIterations = 3; // Average the previous TIME_STEPS ti

有人能发现下面的代码有什么问题吗。它应该平均前一时间的帧间隔(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;
}
-(无效)更新:(ccTime)dt
{
浮动32个时间步;
常数int32速度迭代=8;
常数int32=3;
//平均上一时间步时间步
对于(int i=0;i<时间步长;i++)
{
timeStep+=上一个时间步长[i];
}
timeStep=timeStep/时间步长;
//踏遍世界
[GB2Engine sharedInstance].world->Step(时间步、速度迭代、位置迭代);
对于(int i=0;i<时间步长-1;i++)
{
前一个时间步[i]=前一个时间步[i+1];
}
以前的时间步长[时间步长-1]=dt;
}
“上一个\u时间\u步数”数组最初也会填充动画间隔设置的内容

这也不符合我的期望。在低帧速率的设备上,它会加快模拟速度;在高帧速率的设备上,它会减慢模拟速度。我敢肯定我看过头了是件蠢事

我知道box2D喜欢使用固定的时间步长,但我真的没有选择。我的游戏在各种设备上以非常可变的帧速率运行,所以固定的时间停止是不起作用的。这款游戏平均每秒运行40帧,但在一些更糟糕的设备上,如第一代iPad,它的运行速度仅为每秒30帧。第三代ipad以每秒50/60帧的速度运行

我也愿意接受关于处理这个问题的其他方法的建议。如有任何建议,将不胜感激

另外一个不寻常的事情是,我应该注意到,有人可能会对这一事实有所了解,即在构建上运行任何调试优化都会对上述方面产生巨大影响。当调试优化设置为-Os vs-O0时,帧速率变化不大。但是当首次优化设置为-Os时,物理模拟的运行速度要比上述代码激活时的-O0快得多。如果我只是使用dt作为间隔,而不是上面的代码,那么调试优化就没有什么区别了

我完全被这搞糊涂了

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

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

PS:如果你做了任何类似的性能测试,请在发布版本中运行它们。这还确保(大多数)日志记录被禁用,代码优化处于启用状态。在旧设备上调试代码可能会对性能产生更大的影响


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

当我说它会加速和减慢时,我的意思是游戏在较低的fps下玩得更快,在较高的fps下玩得更慢。所以,如果在高fps下从A到B需要2秒,那么在低fps下可能需要一半的时间。有人向我指出,我不是在初始化timeStep。因此,当调试优化关闭时,它会自动被分配为零,但当调试优化打开时,它不会自动分配任何内容。我不知道它是如何在发布模式下播放的:/我没有直接使用增量时间,因为有时帧速率会在短时间内突然下降,所以增量时间非常大,最终会产生不和谐的结果。封顶可能是一条路要走。