2013-06-22 59 views
0

我的渲​​染循環有問題。在移動物體的過程中,我看到一個小口吃,看起來像eglSwapBuffers swap的同一緩衝區兩次。我的FPS一直在59 - 60 FPS之間。在計算新位置時,運動需要考慮deltaTimeAndroid OpenGL口吃 - vsync?

這可能是什麼?可以雙緩衝解決這個問題?

這裏是一個小視頻(希望你會明白我的意思)。 http://youtu.be/bQYiqHUzPuI

這裏是我的渲染循環

BOOL CEngine::OnStep() 
{ 
    BOOL bResult = TRUE; 
    UINT32 u32CurrFrameStartTime = GetTime(); 
    FLOAT32 f32DeltaTime; 

    f32DeltaTime = (u32CurrFrameStartTime - m_u32LastFrameStartTime)/1000000000.0f; 
    m_u32LastFrameStartTime = u32CurrFrameStartTime; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    GLERROR(); 

    if (m_pScreenBase == NULL) 
    { 
     if (eglSwapBuffers(m_pDisplay, m_pSurface) == EGL_FALSE) 
     { 
      LogError("eglSwapBuffers function failed."); 
     } 

     if ((m_pScreenBase = new CStartScreen()) == NULL) 
      LogError("Can't allocate memory for CStartScreen."); 

     m_pScreenBase->Initialize(); 
    } 

    m_pScreenBase->Update(f32DeltaTime); 
    m_pScreenBase->Render(); 

    if (eglSwapBuffers(m_pDisplay, m_pSurface) == EGL_FALSE) 
    { 
     LogError("eglSwapBuffers function failed."); 
    } 

    m_i32FramesPerSecond += 1; 

    if (GetTime() - m_u32FPSResetTimer >= 1000000000) 
    { 
     LogFPS("%d", m_i32FramesPerSecond); 
     m_i32FramesPerSecond = 0; 
     m_u32FPSResetTimer = GetTime(); 
    } 

    // return false when app should be exit 
    return bResult; 
} 

這裏是更新的功能

void CStartScreen::Update(FLOAT32 f32DeltaTime) 
{ 
    for (INT32 i = 0; i < MAX_SQUARES; i++) 
    { 
     m_pSquare[ i ]->IncPosX((400.0f * f32DeltaTime)); 

     if (m_pSquare[ i ]->GetPosX() >= 800.0f) 
     { 
      m_pSquare[ i ]->IncPosX(-(800.0f + m_pSquare[ i ]->GetWidth())); 
     } 
    } 
} 

如果它的需要,我可以張貼我的EGLOpenGL設置了。

UPDATE 1:

UINT32被定義爲

的typedef unsigned int的UINT32;

inline UINT32 GetTime() 
{ 
    timespec sTime; 
    UINT32  u32Return = 0; 

    clock_gettime(CLOCK_MONOTONIC, &sTime); 
    u32Return = (sTime.tv_sec * 1000000000LL) + sTime.tv_nsec; 

    return u32Return; 
} 

這裏是增量時間1秒

f32DeltaTime : 0.012029 
f32DeltaTime : 0.016487 
f32DeltaTime : 0.016548 
f32DeltaTime : 0.023608 
f32DeltaTime : 0.017631 
f32DeltaTime : 0.023363 
f32DeltaTime : 0.012963 
f32DeltaTime : 0.026373 
f32DeltaTime : 0.016470 
f32DeltaTime : 0.012811 
f32DeltaTime : 0.016439 
f32DeltaTime : 0.016852 
f32DeltaTime : 0.025931 
f32DeltaTime : 0.012679 
f32DeltaTime : 0.013243 
f32DeltaTime : 0.014694 
f32DeltaTime : 0.016561 
f32DeltaTime : 0.016589 
f32DeltaTime : 0.020299 
f32DeltaTime : 0.014101 
f32DeltaTime : 0.016626 
f32DeltaTime : 0.016892 
f32DeltaTime : 0.016347 
f32DeltaTime : 0.018130 
f32DeltaTime : 0.019623 
f32DeltaTime : 0.012288 
f32DeltaTime : 0.016677 
f32DeltaTime : 0.016895 
f32DeltaTime : 0.016405 
f32DeltaTime : 0.018474 
f32DeltaTime : 0.017564 
f32DeltaTime : 0.014213 
f32DeltaTime : 0.016659 
f32DeltaTime : 0.016830 
f32DeltaTime : 0.016486 
f32DeltaTime : 0.018657 
f32DeltaTime : 0.026178 
**f32DeltaTime : 0.006349** 
f32DeltaTime : 0.014091 
f32DeltaTime : 0.016504 
f32DeltaTime : 0.016617 
f32DeltaTime : 0.024325 
f32DeltaTime : 0.013866 
f32DeltaTime : 0.015417 
f32DeltaTime : 0.014500 
f32DeltaTime : 0.016950 
f32DeltaTime : 0.016418 
f32DeltaTime : 0.018194 
f32DeltaTime : 0.016803 
f32DeltaTime : 0.017097 
f32DeltaTime : 0.013594 
f32DeltaTime : 0.016732 
f32DeltaTime : 0.016599 
f32DeltaTime : 0.017600 
f32DeltaTime : 0.021286 
f32DeltaTime : 0.012039 
f32DeltaTime : 0.016735 
f32DeltaTime : 0.017146 
f32DeltaTime : 0.020083 

不知道,但我想行「f32DeltaTime:0.006349」可能是問題......但是,爲什麼f32DeltaTime是如此之小在一些幀? eglSwapBuffers在這個框架中什麼都不做?但爲什麼 ???問題問題:)

+0

你確定沒有什麼重置'm_pScreenBase'爲NULL? – fadden

+0

嗨,我敢肯定,沒有什麼是重置m_pScreenBase。我越來越瘋狂了:(什麼可能會導致這個問題??? –

+0

我認爲小三角洲可能會出現,在一個更大的三角洲後面,它應該平均爲60fps 0.0167; 0.026178 + .006349 == .032527,平均值0.0163。 – fadden

回答

0

它看起來像你的時間基準是納秒,但保持在一個32位整數。如果您要在GetTime()函數中將值從clock_gettime()中提取出來,則需要秒和納秒,並且應該將其保留在64位整數中。否則,當計算增量時,時間有時會向後跳躍。

舉例來說,如果你只使用tv_nsec:

  • 前一幀起始時間是0秒900000ns
  • 當前幀的開始時間爲1s 100000ns

如果你只是減去納秒,您將獲得800000ns的向後跳躍,而不是200000ns的向前跳躍。

您可以通過記錄f32DeltaTime值來檢查它是否一致。

+0

嗨,我更新了我的問題,並添加了GetTime函數。我試過時間計算爲64位整數,但問題仍然存在... :( –

+0

嗨,我再次更新了我的帖子...謝謝你試圖幫助我:) –

+0

看起來像這不是那麼。:-( – fadden