Me estoy basando en el código de Hoffman, Mitchell y Preetham para controlar los Frames Per Second (FPS) de mi animación, con objeto de variarlo a voluntad a un valor determinado.
Funciona bien cuando los fps-deseados son bajos, entre 5 y 30, pero a partir de 35 veo que se reducen los fps obtenidos y tienden a un valor fijo, aproximadamente 60 fps para cualquier pfs-deseado superior a 70.
Estoy probando con una animación muy simple, un cubo en alambre, para entender el mecanismo. Pero no me funciona nada bien. Si comento el Sleep() consigo más de 1000 fps, por lo que no es problema de mi código ni de la tarjeta aceleradora, más bien creo que el Sleep no funciona bien para este propósito.
¿Conocéis otra manera de controlar los fps de un renderizado?/* (c) 2002 Nathaniel Hoffman, Kenneth J. Mitchell and Arcot J. Preetham */
//-----------------------------------------------------------------------------
// Name: CAppForm::Render()
// Desc: Called once per frame, the call is the entry point for 3d
// rendering. This function sets up render states, clears the
// viewport, and renders the scene.
//-----------------------------------------------------------------------------
HRESULT CAppForm::Render()
{
DXUtil_Timer( TIMER_GETELAPSEDTIME ); // Start timer.
m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
0x000000ff, 1.0f, 0L ); // Clear the viewport
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) ) // Begin the scene
{
m_pScene->Render(); // TODO: render world
m_pd3dDevice->EndScene(); // End the scene.
}
FLOAT fTimePerFrame = DXUtil_Timer(TIMER_GETELAPSEDTIME) * 1000; // End timer
float fDesiredFPS = 50;
float fDesiredTimePerFrame = 1000.0/fDesiredFPS; // in ms
if (fTimePerFrame < fDesiredTimePerFrame)
Sleep(fDesiredTimePerFrame-fTimePerFrame);
return S_OK;
}
(La función DXUtil_Timer se basa en las QueryPerformanceFrequency y QueryPerformanceCounter)