2010-11-06 69 views
0

我的OpenGL ES類和代碼源自Apple的GLES2Sample code sample。我用它們來顯示圍繞一個軸線平滑旋轉的3D物體,這是我期望的恆定旋轉速度。目前,應用程序使用1的幀間隔,並且每次繪製OpenGL視圖時(在EAGLView的drawView方法中),我都將模型旋轉一定的角度。在iPhone上使用CADisplayLink在OpenGL ES視圖中進行等速旋轉

實際上,這給出了不錯的結果,但並不完美:在旋轉過程中,當物體的大部分不見光時,渲染變得更快,因此旋轉不具有恆定的角速度。我的問題是:如何讓它更平滑?

儘管我很歡迎所有建議,但我已經有一個想法:每半秒測量一次渲染FPS,並根據這一點調整每次重繪時的旋轉角度。但是,這聽起來不太好,你如何看待這個問題?你將如何處理這個問題?

回答

3

我傾向於使用CADisplayLink在框架請求中觸發新框架和簡單時間計算,以確定我的邏輯有多遠。

假設您有一個NSTimeInterval類型的成員變量timeOfLastDraw。你希望你的邏輯在每秒60次跳動時打勾。然後(用一大堆變量使代碼更清晰):

- (void)displayLinkDidTick 
{ 
    // get the time now 
    NSTimeInterval timeNow = [NSDate timeIntervalSinceReferenceDate]; 

    // work out how many quantums (rounded down to the nearest integer) of 
    // time have elapsed since last we drew 
    NSTimeInterval timeSinceLastDraw = timeNow - timeOfLastDraw; 
    NSTimeInterval desiredBeatsPerSecond = 60.0; 
    NSTimeInterval desiredTimeInterval = 1.0/desiredBeatsPerSecond; 

    NSUInteger numberOfTicks = (NSUInteger)(timeSinceLastDraw/desiredTimeInterval); 

    if(numberOfTicks > 8) 
    { 
     // if we're more than 8 ticks behind then just do 8 and catch up 
     // instantly to the correct time 
     numberOfTicks = 8; 
     timeOfLastDraw = timeNow; 
    } 
    else 
    { 
     // otherwise, advance timeOfLastDraw according to the number of quantums 
     // we're about to apply. Don't update it all the way to now, or we'll lose 
     // part quantums 
     timeOfLastDraw += numberOfTicks * desiredTimeInterval; 
    } 

    // do the number of updates 
    while(numberOfTicks--) 
     [self updateLogic]; 

    // and draw 
    [self draw]; 
} 

在你的情況中,updateLogic將應用固定的旋轉量。如果不斷旋轉,真是你想要的,那麼你可以僅僅通過numberOfTicks乘旋轉不變,甚至跳過這個整體方法,並做一些事情,如:

glRotatef([NSDate timeIntervalSinceReferenceData] * rotationsPerSecond, 0, 0, 1); 

,而不是對你自己的變量。除了最微不足道的情況之外,你通常都想在每個時間範圍內完成一大堆複雜的事情。

1

如果你不想渲染加速變化,並正在運行的開環(即完全傾斜)與CADisplayLink或其他動畫定時器,有兩件事情可以做:

1)優化您的代碼,因此它永遠不會低於60 FPS - 在您的型號的任何情況下設備的最大幀速率。

2)在運行時,通過幾個完整的週期測量應用程序的幀速率,並設置繪製速率,使其不會超過最低測量繪製性能。

我相信調整你的旋轉角度不是解決這個問題的正確方法,因爲你現在試圖保持兩個參數彼此分開(繪製速率和旋轉速率),而不是簡單地固定一個參數:draw率。

乾杯。