我的渲染循環有問題。在移動物體的過程中,我看到一個小口吃,看起來像eglSwapBuffers
swap的同一緩衝區兩次。我的FPS一直在59 - 60 FPS之間。在計算新位置時,運動需要考慮deltaTime
。Android 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()));
}
}
}
如果它的需要,我可以張貼我的EGL
和OpenGL
設置了。
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在這個框架中什麼都不做?但爲什麼 ???問題問題:)
你確定沒有什麼重置'm_pScreenBase'爲NULL? – fadden
嗨,我敢肯定,沒有什麼是重置m_pScreenBase。我越來越瘋狂了:(什麼可能會導致這個問題??? –
我認爲小三角洲可能會出現,在一個更大的三角洲後面,它應該平均爲60fps 0.0167; 0.026178 + .006349 == .032527,平均值0.0163。 – fadden