2015-12-07 3 views
1

fps моей программы неверны. Когда я вычисляю fps своего приложения с использованием статистики RivaTuner, он дает, например, 3000 кадров в секунду. Но моя программа вычисляет действительно другое число, например, 500. Оно все время идет вверх и вниз, в то время как Rivatuner этого не делает.C++ Неверное измерение FPS и deltaTime с использованием std :: chrono

Это, как я вычислить DeltaTime (переменная DeltaTime с плавающей точкой):

std::chrono::high_resolution_clock timer; 
auto start = timer.now(); 

...doing stuff here... 

auto stop = timer.now(); 
deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count()/1000.0f; //DELTATIME WAS LESS THAN 1 MILLISECOND SO THAT IS WHY I USED THIS 

Это, как рассчитать FPS:

float fps = (1.0f/deltaTime) * 1000.0f; 

Я умножать свои скорости игры с переменной DeltaTime , а потому, что он делает странные вещи (все вверх и вниз очень быстро все время), которые тоже прищурены. Так, например, мой RivaTuner говорит, что в 2000 fps моя игра работает медленнее, чем когда она говорит 4000 кадров в секунду.

Но когда приложение работает медленнее, ему требуется больше времени для рендеринга 1 кадра (так, чем выше дельта-время, тем выше скорость игры?).

Это правильно?

Заранее спасибо.

+1

Вы пересчитываете fps для каждого кадра отдельно? Это объясняет скачкообразность вашего результата. Вы получите гораздо более точные результаты, если вы возьмете среднее значение в течение более длительного времени. – JSQuareD

+0

Даже если я это сделаю, скорость игры по-прежнему остается нервной. –

+0

На сколько кадров/сколько времени вы усредняете по своим результатам? – JSQuareD

ответ

0

Как и в случае с JSQuareD, при вычислении FPS вы должны брать среднее значение после измерения многих кадров. Причина в том, что скорость выполнения кадров, как правило, сильно отличается по многим причинам.

Суммируйте данные измерений, скажем, 0,5 секунды и вычислите среднее значение. Да, это глупо, как кажется.

Но вы должны быть осторожны с этой статистикой FPS - вы могли бы иметь даже 60 FPS, и игра все равно выглядела бы застрявшей. Зачем? Поскольку несколько кадров занимали очень длительное время дельты, и большинство кадров занимало очень быстрое дельта-время. (Это случается больше, чем кажется)

Вы можете решить последнюю проблему, просмотрев график или посчитав стандартное отклонение, но на данный момент это более сложная проблема.

1

[Мой счетчик fps] все время идет вверх и вниз, в то время как у Rivatuner нет.

Обычно рендеринг и другие расчеты принимают переменное количество времени. Если вы вычисляете fps в каждом кадре, тогда ожидается, что он будет идти вверх и вниз.

deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count()/1000.0f; 

Не делайте этого. Если вы хотите, значение с плавающей точкой в ​​миллисекундах с минимальной потерей точности, то сделать это:

using ms = std::chrono::duration<float, std::milli>; 
deltaTime = std::chrono::duration_cast<ms>(stop - start).count(); 

Но когда приложение работает медленнее, ему нужно больше времени, чтобы сделать 1 кадр

Правильным ,

так, более высокий DeltaTime

Правильно.

поэтому более высокая скорость игры?

Скорость рендеринга не влияет на скорость игры, если все масштабируется по отношению к пройденному времени. Является ли это влиять на скорость невозможно, не зная, что делает ваша игра.

Если это влияет на скорость игры, возможно, что-то не так с тем, как вы реализовали игру. Если у вас есть поведение, чувствительное к длительности временного шага, например физика, то эти вычисления должны выполняться с фиксированным шагом времени. Например, 120 раз в секунду. Если ваш fps выше, то пропустите продвижение моделирования, и если ваш fps ниже, повторите симуляцию.

+0

Я сделал это, но все же. Когда fps опускается ниже, скорость игры идет медленнее. –

Смежные вопросы