Como manter o FPS constante
Para quem está programando joguinhos simples em C/C++ usando a API do Windows vou dar (no bom sentido) uma dica sobre como manter o FPS constante e intenso (no bom sentido).
Sem um controle seu jogo irá processar os gráficos na velocidade do processador. Os computadores tem velocidades diferentes e as aplicações não tem um processamento constante e igual, seu jogo poderá rodar a 124 FPS, mas se mexer o mouse irá para 81 FPS, por exemplo.
Antes de continuar você tem que conhecer o básico de como criar uma janela usando a Win32 API. Terá que usar também o PeekMessage ao invés do GetMessage no loop que pega os eventos (mensagens).
Agora vamos a lógica da coisa, você tem que "pausar" esse loop em determinados intervalos, por exemplo, se quiser 60 FPS terá que pausar 60 vezes por segundo de modo que no final a soma dos intervalos atinja 1 segundo. Para pausar use o Sleep, porém ele trabalha em milisegundos, mas é só dividir 1000.0 (milisegundos) por 60.0 (FPS).
Sleep(16.66); // ou Sleep(1000.0/60.0);
Pronto! Rápido e prático que nem miojo.
Agora se for um jogo pesado você terá que levar em contar o tempo de cada execução do loop. Use a função GetTickCount para capturar o tempo.
A cada loop some 16.66 ao tempo de execução do loop anterior, subtraia pelo tempo atual e o resultado será o tempo que o loop deve aguardar (Sleep). Se o resultado for negativo então o loop não deve aguardar.
Código abaixo pode ser mais esclarecedor:
// ... int iSleepTime = 0; BOOL bPeekMsgRes; DWORD lastTime = GetTickCount(); while(1) // Main event loop { bPeekMsgRes = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE); if(bPeekMsgRes) { if(Msg.message == WM_QUIT) { break; // Break main event loop } else { TranslateMessage(&Msg); DispatchMessage(&Msg); } } /* ---- Main game processing ---- */ // Corta, pica e fatia no jogo... /* ---- FPS control ---- */ lastTime += 16.66; iSleepTime = lastTime - GetTickCount(); if(iSleepTime > -1) { // Normal Sleep(iSleepTime); } else { // Lento } } /* ---- Game Over ---- */ // ...
obs: Tem um "printf" ali que só vai aparecer se a janela tiver um prompt. Você pode compilar sua aplicação/jogo/miojo para que seja exibido o prompt junto, não sei como se faz isso no VisualC++, mas no DevC++ (GCC) crie um projeto "Win32 Console" ou compile com "-mconsole".
Deixe um comentário |

