Fazendo Controle de FPS
Introdução: Frames por Segundo
Você deve ter percebido no último exemplo que ao pressionar uma tecla eram impressas diversas mensagens “ao mesmo tempo”.
Isso ocorre por causa do loop infinito. A gente chama cada loop completo de 1 frame. Quanto mais rápido é um processador, mais frames por segundo serão gerados.
Fica evidente um problema: se formos mover um Sprite a 0.1 pixels/frame, como fizemos no exemplo anterior, em um computador mais rápido ele vai SE MOVER mais rápido
Para solucionar esse problema, temos o Controle de FPS que vai garantir que um jogo rode na “mesma velocidade” em diferentes máquinas, pois vai estar em função do TEMPO e não de FRAMES.
Isso vai ficar mais claro no exemplo abaixo. Vamos mostrar com e sem o controle de FPS.
Controlando FPS com delta_time()
# Como sempre, importamos nossa janela
from PPlay.window import *
# E agora o Sprite
from PPlay.sprite import *
janela = Window(500, 500)
kobra = Sprite("kobra.png")
speed_per_FRAME = 60
speed_per_SECOND = 60
while True:
janela.set_background_color((255, 255, 255))
# Irá se mover 60 pixels a cada FRAME - sumirá da tela instantaneamente
kobra.move_x(speed_per_FRAME)
# Irá se mover 60 pixels a cada SEGUNDO - independente do processador
# kobra.move_x(speed_per_SECOND * janela.delta_time())
kobra.draw()
janela.update()
Se você rodar esse código, a kobra vai sair da tela em milissegundos. Isso pois o intervalo entre cada frame é MUITO baixo!
Nós temos então a função janela.delta_time() que retorna em segundos esse intervalo.
Ao multiplicar a speed_per_SECOND por esse delta_time(), nós podemos ver que não importa o intervalo (ou seja, um computador mais rápido ou mais lento), mas o Sprite vai se mover em relação ao tempo (mesmo que seja menos suave).
É evidente que quanto mais frames por segundo, mais suave será o movimento. Observe a tabela abaixo:
delta_time | FPS (1/delta_time) | speed (100 * delta_time) – em Pixels/Frame | Total (speed * FPS) – em Pixels/Segundo |
---|---|---|---|
2.000 s | 0.500 | 200 | 100 |
1.000 s | 1.000 | 100 | 100 |
0.100 s | 10.00 | 10 | 100 |
0.010 s | 100.0 | 1 | 100 |
Observe que apesar de a primeira linha ter apenas 1 frame a cada 2 segundos, o movimento do Sprite é compensado se movendo muito mais que o outro com 100 FPS. A diferença é que quanto menos frames, menos suave é o movimento.
Créditos do Tutorial: Gabriel Saldanha