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_timeFPS (1/delta_time)speed (100 * delta_time) – em Pixels/FrameTotal (speed * FPS) – em Pixels/Segundo
2.000 s0.500200100
1.000 s1.000100100
0.100 s10.0010100
0.010 s100.01100

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.


Download do Código Completo


Créditos do Tutorial: Gabriel Saldanha