Вероятно, лучше использовать среднее значение для небольшого числа кадров. Вы упомянули, что хотите вычислить среднее значение, но на самом деле нет причин хранить такое большое количество выборок для расчета среднего значения. Просто сохраняйте общее количество кадров в течение небольшого промежутка времени (где маленьким может быть что-то между 10-50 кадрами - мы обычно используем 16). Затем вы можете использовать эту сумму для расчета среднего числа кадров в секунду. Этот метод также помогает сгладить отчеты о времени кадра, чтобы числа не перепрыгивали повсюду. Однако следует обратить внимание на то, что при усреднении за слишком длительный период времени пики частоты кадров становятся более «скрытыми», что означает, что может быть сложнее обнаружить кадры, из-за которых частота кадров падает, если эти кадры случаются очень часто .
Что-то вроде этого было бы вполне достаточно, я думаю (непроверенный код, чтобы следовать):
// setup some variables once
const int Max_samples = 16; // keep at most 16 frametime samples
int FPS_Samples = 0;
int Current_sample = 0;
int Total_frametime = 0.0f;
float Frametimes[Max_samples];
for ( int i = 0; i < Max_samples; i++ ) {
Frametimes[i] = 0.0f;
Затем, когда вы вычисляете время кадра, вы можете сделать что-то вроде этого:
// current_frametime is the new frame time for this frame
Total_frametime -= Frametimes[Current_sample];
Total_frametime += current_frametime;
Frametimes[Current_sample] = current_frametime;
Current_sample = ( Current_sample + 1 ) % Max_samples; // move to next element in array
Frames_per_second = Max_samples / Total_frametime;
Это черновой вариант и, возможно, может использоваться некоторая проверка ошибок, но это дает общее представление.