Można to zrobić na co najmniej dwa sposoby:
Pierwsza to ta, o której inni wspomnieli wcześniej. Myślę, że to najprostszy i preferowany sposób. Musisz tylko śledzić
- cn: licznik liczby wyrenderowanych klatek
- time_start: czas od rozpoczęcia liczenia
- time_now: aktualny czas
Obliczenie fps w tym przypadku jest tak proste, jak oszacowanie tego wzoru:
- FPS = cn / (time_now - time_start).
Jest też super fajny sposób, z którego możesz skorzystać pewnego dnia:
Powiedzmy, że masz do rozważenia ramki typu „i”. Użyję tego zapisu: f [0], f [1], ..., f [i-1], aby opisać, jak długo trwało renderowanie klatki 0, klatki 1, ..., klatki (i-1 ) odpowiednio.
Example where i = 3
|f[0] |f[1] |f[2] |
+----------+-------------+-------+------> time
Wtedy matematyczna definicja fps po i klatkach byłaby
(1) fps[i] = i / (f[0] + ... + f[i-1])
I ta sama formuła, ale biorąc pod uwagę tylko klatki i-1.
(2) fps[i-1] = (i-1) / (f[0] + ... + f[i-2])
Teraz sztuczka polega na zmodyfikowaniu prawej strony wzoru (1) w taki sposób, aby zawierała prawą stronę wzoru (2) i zastąpiła ją lewą stroną.
Tak (powinieneś zobaczyć to wyraźniej, jeśli napiszesz to na papierze):
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)
Więc zgodnie z tym wzorem (chociaż moje umiejętności matematyczne są trochę zardzewiałe), aby obliczyć nowe fps, musisz znać fps z poprzedniej klatki, czas trwania renderowania ostatniej klatki i liczbę klatek, które renderowane.