2012-08-09 49 views
0

任何人都可以發現下面的代碼有什麼問題。它應該爲先前的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作爲間隔而不是上面的代碼,那麼調試優化沒有任何區別。

我完全被這個困惑了。

回答

1

在低幀率的設備上,它加快了模擬速度,並且在高幀率的設備上減慢了速度。

這就是使用可變時間步驟的全部內容。如果你只得到10 fps,物理引擎會更快地迭代世界,因爲增量時間更長。 PS:如果您進行任何類似的性能測試,請使用發佈版本運行它們。這也確保(大部分)日誌記錄被禁用並且代碼優化處於打開狀態。您可能只是通過在舊設備上調試代碼而對性能產生更大的影響。

另外,什麼值是TIME_STEPS?它不應該超過10個,最多20個。平均的替代方法是直接使用增量時間,但如果增量時間大於某個閾值(30 fps),則切換到使用固定增量時間(上限)。因爲30 fps以下的可變時間步長可能會變得非常難看,所以在這種情況下,讓物理引擎的速度減慢,否則遊戲將變得更難,如果在低fps下無法播放。

+0

當我說它加快速度並放慢速度時,我的意思是遊戲在低fps時播放更快,而在高fps時播放速度更慢。所以如果需要2秒的時間從高到低從A到B,那麼在低fps時可能需要一半的時間。 – Tiddly 2012-08-09 21:54:46

+0

有人向我指出,我不是初始化timeStep。因此,關閉調試優化會發生什麼情況,它會自動分配爲零,但調試優化不會自動分配任何內容。我不知道它是如何在發佈模式下播放的:/我沒有直接使用增量時間,因爲有時幀速率會在短時間內突然下降,因此增量時間很長,最終會出現令人不安的結果。封頂它可能是要走的路。 – Tiddly 2012-08-09 22:00:19