Есть как минимум два способа сделать это:
Первый - это тот, о котором другие упоминали здесь до меня.
Я думаю, что это самый простой и предпочтительный способ. Вы просто следить за
- cn: счетчик количества отображаемых кадров
- time_start: время с начала подсчета
- time_now: текущее время
Вычисление fps в этом случае так же просто, как вычисление этой формулы:
- FPS = cn / (time_now - time_start).
Тогда есть очень крутой способ, которым вы могли бы когда-нибудь воспользоваться:
Допустим, у вас есть кадры 'i' для рассмотрения. Я буду использовать эту запись: f [0], f [1], ..., f [i-1], чтобы описать, сколько времени потребовалось для рендеринга кадра 0, кадра 1, ..., кадра (i-1 ) соответственно.
Example where i = 3
|f[0] |f[1] |f[2] |
+----------+-------------+-------+------> time
Тогда математическое определение fps после i кадров будет
(1) fps[i] = i / (f[0] + ... + f[i-1])
И та же формула, но только с учетом кадров i-1.
(2) fps[i-1] = (i-1) / (f[0] + ... + f[i-2])
Теперь хитрость заключается в том, чтобы изменить правую часть формулы (1) таким образом, чтобы она содержала правую часть формулы (2), и заменить ее левой стороной.
Примерно так (вы должны видеть это более четко, если напишите на бумаге):
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)
Таким образом, в соответствии с этой формулой (хотя мой навык получения математики немного устарел), чтобы вычислить новые fps, вам нужно знать fps из предыдущего кадра, длительность, необходимую для рендеринга последнего кадра, и количество кадров. Вы сделали.