任何人都可以發現下面的代碼有什麼問題。它應該爲先前的TIME_STEPS幀數平均幀間隔(dt)。Box2D的可變時間步錯誤
我使用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幀,但在一些像第一代iPad這樣令人討厭的設備上運行速度僅爲每秒30幀。第三代ipad以每秒50/60幀的速度運行它。
我也樂意提出處理這個問題的其他方法。任何意見,將不勝感激。
其他不尋常的東西我應該注意到,有人可能會有一些洞察到的事實是,在構建上運行任何調試優化對上述有很大的影響。當調試優化設置爲-Os和-O0時,幀速率沒有太大變化。但是,當首次優化設置爲-Os時,物理模擬運行速度比-O0快得多,當上面的代碼處於活動狀態時。如果我只是使用dt作爲間隔而不是上面的代碼,那麼調試優化沒有任何區別。
我完全被這個困惑了。
當我說它加快速度並放慢速度時,我的意思是遊戲在低fps時播放更快,而在高fps時播放速度更慢。所以如果需要2秒的時間從高到低從A到B,那麼在低fps時可能需要一半的時間。 – Tiddly 2012-08-09 21:54:46
有人向我指出,我不是初始化timeStep。因此,關閉調試優化會發生什麼情況,它會自動分配爲零,但調試優化不會自動分配任何內容。我不知道它是如何在發佈模式下播放的:/我沒有直接使用增量時間,因爲有時幀速率會在短時間內突然下降,因此增量時間很長,最終會出現令人不安的結果。封頂它可能是要走的路。 – Tiddly 2012-08-09 22:00:19