Hay al menos dos formas de hacerlo:
El primero es el que otros han mencionado aquí antes que yo. Creo que es la forma más sencilla y preferida. Tu solo para hacer un seguimiento de
- cn: contador de cuántos fotogramas has renderizado
- time_start: el tiempo desde que comenzó a contar
- time_now: la hora actual
Calcular los fps en este caso es tan simple como evaluar esta fórmula:
- FPS = cn / (hora_ahora - hora_inicio).
Luego está la forma súper genial que le gustaría usar algún día:
Digamos que tiene marcos en 'i' para considerar. Usaré esta notación: f [0], f [1], ..., f [i-1] para describir cuánto tiempo tomó renderizar el cuadro 0, el cuadro 1, ..., cuadro (i-1 ) respectivamente.
Example where i = 3
|f[0] |f[1] |f[2] |
+----------+-------------+-------+------> time
Entonces, la definición matemática de fps después de i cuadros sería
(1) fps[i] = i / (f[0] + ... + f[i-1])
Y la misma fórmula pero solo considerando marcos i-1.
(2) fps[i-1] = (i-1) / (f[0] + ... + f[i-2])
Ahora, el truco aquí es modificar el lado derecho de la fórmula (1) de tal manera que contenga el lado derecho de la fórmula (2) y sustituirlo por su lado izquierdo.
Así (deberías verlo más claramente si lo escribes en un 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)
Entonces, de acuerdo con esta fórmula (aunque mi habilidad de derivación matemática está un poco oxidada), para calcular los nuevos fps necesita conocer los fps del cuadro anterior, la duración que tardó en renderizar el último cuadro y la cantidad de cuadros que ha prestados.