Войти
ПрограммированиеФорумОбщее

Как кошерно считать FPS ?

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 Следующая »
#0
(Правка: 15:36) 15:34, 14 мая 2019

Как кошерно считать FPS ?
Вариант с 1 / dt слишком не стабильный.
Кто как вообще считает? Может есть какие-то хитрости, тайны, сложные алгоритмы?


#1
16:32, 14 мая 2019

Почему не стабильный? Считай минимальный, средний за последние n кадров, максимальный.

#2
(Правка: 16:36) 16:36, 14 мая 2019

Voley
да проблема в том, что посчитать время между кадрами не даст точный fps. По факту 3 кадра могут идти с таймингом 18 22 18, но на экран идти с интервалом в 20 мс. Получается фпс реальный 60, а посчитанный будет скачком от 58 до 62

#3
16:47, 14 мая 2019

Можно, к примеру, использовать кольцевой буффер.
При каждой отрисовке фрейма кладёшь в буффер текущий временной отрезок. (при помощи чего-то, что имеет хорошую точность(к примеру какой-нибудь аналог clock_gettime).
Смотришь временную дельту между концом и началом. Если >=1sec, то кол-во элементов между концом и началом - твой fps.

+ Показать
#4
16:51, 14 мая 2019

Rewlion
Ну у меня что-то похожее на это сейчас и сделано. Только более простым способом.

#5
17:31, 14 мая 2019

Я в каждом кадре инкрементирую счётчик, а раз в секунду вывожу значение счётчика и обнуляю его.

#6
20:29, 14 мая 2019

Mikle
+1

#7
(Правка: 23:09) 22:49, 14 мая 2019

Mikle
Раньше под дос к таймеру сбрасывалку цепляли.
oxotnik
От дельты, если движек ее уже предоставляет, проще и нагляднее, сразу просадки видно.
Еще можно половину считать.

FPS = FPS*0.5 + 0.5/dt;

или четверть

FPS = FPS *0.75 + 0.25/dt;

Будет меняться с разной скоростью, более плавно. И выводить все варианты счетчиков FPS разом, плюс средний минимум максимум за секунду, чтобы более объективно оценить.

#8
10:39, 15 мая 2019

foxes
как я уже говорил, с дельтой возникает проблема синхроимпульса с монитором. Когда мы вроде-как тормозим, а реально не тормозим

#9
(Правка: 15:48) 15:36, 15 мая 2019

oxotnik
Как я уже сказал, прыгающая последовательность выровняется.

50 51    48      53   49   20   50
50 50,25 49,6875 50,5 50,1 42,6 44,4
А частота монитора обычно храниться в свойствах установленного режима, для этого нет необходимости ее высчитывать.
FPS = lerp(FPS, 1/dt, speed);
#10
15:44, 15 мая 2019

FPS - количество кадров в секунду.  "Кошерно" и обновлять это значение в движке один раз в секунду.

Хотите выводите текст один раз в секунду, а хотите обновляйте выводимое значение один раз в секунду.

#11
(Правка: 15:53) 15:52, 15 мая 2019

А как например fraps считает? Есть может исходники?

#12
16:04, 15 мая 2019
void TimerClass::Frame()
{

  QueryPerformanceCounter(¤tTime);

//  https://msdn.microsoft.com/en-us/library/dn553408%28v=vs.85%29.aspx

  frameTime = (currentTime.QuadPart - startTime.QuadPart) * 1000000000 / m_ticksPerSec;  // Время кадра в наносекундах

  ++frameCount;

  if ( frameTime > 1000000000LL )
  {
    m_fps = frameCount; // FPS в секунду
    frameCount = 0;
    startTime = currentTime;
  }  

  return;
}
#13
16:09, 15 мая 2019

bykabak
Тоже что и у Mikle

#14
(Правка: 16:17) 16:16, 15 мая 2019

У меня так-же считает. Только код попроще

sheduler += [fpsLabel, frameCount = 0, total = 0s] (auto&& dt) mutable
{
  ++frameCount;
  total += dt;
  if (total >= 1.0s) 
  {
    fpsLabel->setText(frameCount); 
    total = 0s; 
    frameCount = 0;
  }
};

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее