Existem pelo menos duas maneiras de fazer isso:
O primeiro é aquele que outros mencionaram aqui antes de mim. Acho que é a forma mais simples e preferida. Você apenas para acompanhar
- cn: contador de quantos quadros você renderizou
- time_start: o tempo desde que você começou a contar
- time_now: a hora atual
Calcular o fps, neste caso, é tão simples quanto avaliar esta fórmula:
- FPS = cn / (time_now - time_start).
Depois, há a maneira super legal que você gostaria de usar algum dia:
Digamos que você tenha frames 'i' a considerar. Usarei esta notação: f [0], f [1], ..., f [i-1] para descrever quanto tempo levou para renderizar o quadro 0, quadro 1, ..., quadro (i-1 ), respectivamente.
Example where i = 3
|f[0] |f[1] |f[2] |
+----------+-------------+-------+------> time
Então, a definição matemática de fps após i frames seria
(1) fps[i] = i / (f[0] + ... + f[i-1])
E a mesma fórmula, mas considerando apenas frames i-1.
(2) fps[i-1] = (i-1) / (f[0] + ... + f[i-2])
Agora, o truque aqui é modificar o lado direito da fórmula (1) de modo que contenha o lado direito da fórmula (2) e substituí-lo por seu lado esquerdo.
Assim (você deve ver mais claramente se escrever em um papel):
fps[i] = i / (f[0] + ... + f[i-1])
= i / ((f[0] + ... + f[i-2]) + f[i-1])
= (i/(i-1)) / ((f[0] + ... + f[i-2])/(i-1) + f[i-1]/(i-1))
= (i/(i-1)) / (1/fps[i-1] + f[i-1]/(i-1))
= ...
= (i*fps[i-1]) / (f[i-1] * fps[i-1] + i - 1)
Portanto, de acordo com esta fórmula (embora minha habilidade de derivar matemática esteja um pouco enferrujada), para calcular os novos fps você precisa saber o fps do quadro anterior, a duração que levou para renderizar o último quadro e o número de quadros que você renderizado.