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

Высокоточный таймер на std::chrono

Страницы: 1 2 3 4 5 Следующая »
#0
6:57, 30 янв 2018

Хочу подкинуть новичкам окончательную реализацию своего таймера:

#include <chrono>

class Timer
{
  using Clock = std::chrono::high_resolution_clock;
  using Time = std::chrono::time_point<Clock>;

public:
  Timer()
  {
    lastTime = m_EndTime = m_StartTime = Now();
    trueFPS = tempFPS = 0;
  }
  virtual ~Timer() {}

void Update()
  {
    auto endTime = Now();
    FrameLength = std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - m_EndTime).count();
    FPS = 1000000000 / FrameLength;
    m_EndTime = endTime;

    tempFPS++;
    if (std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - lastTime).count() > 1000000000)
    {
      lastTime = endTime;
      trueFPS = tempFPS;
      tempFPS = 0;
    }

    auto currentTime = (endTime - m_StartTime);
    Seconds = std::chrono::duration_cast<std::chrono::seconds>(currentTime).count();
    if (Seconds < 1) trueFPS = FPS;

    Hours = std::chrono::duration_cast<std::chrono::hours>(currentTime).count();
    Minutes = std::chrono::duration_cast<std::chrono::minutes>(currentTime).count() - Hours * 60;
    Seconds = Seconds - Hours * 3600 - Minutes * 60;
  }

  float GetAverageDelta() { return FrameLength / 1000000.0f; }
  void Reset() { m_EndTime = m_StartTime = std::chrono::high_resolution_clock::now(); }

  int64_t tempFPS, trueFPS, FPS, FrameLength, Seconds, Minutes, Hours;

private:
  Time Now() const { return Clock::now(); }

  std::chrono::time_point<std::chrono::high_resolution_clock> m_StartTime, m_EndTime;
};
#1
7:03, 30 янв 2018

Daniil Petrov
мало кому нужна именно точная дельта между кадрами, обычно усредняют за последние n-цать милисекунд.

#2
7:04, 30 янв 2018

Aroch
> мало кому нужна именно точная дельта между кадрами
Почему?

#3
7:05, 30 янв 2018

Daniil Petrov
потому что не нужны никому скачки fps и всех сопутствующих расчетов.

#4
7:07, 30 янв 2018

Aroch
Ну, если потребуется, я усложню код и буду считать кадры вручную и усреднять дельту кадра.

#5
7:09, 30 янв 2018

Daniil Petrov
когда можно добавить в таймер два метода: SetSmooth(int), GetAverageDelta()

#6
7:11, 30 янв 2018

Aroch
Благодарю за наколку!

#7
9:00, 30 янв 2018

Этот таймер не переглючивает, если драйвера мамки не установить? Или на Win7 и старше эта проблема исчезла?  Более старые системы то сейчас наверное уже не поддерживают.

#8
10:12, 30 янв 2018

Zab
Ещё бы на Win95 проверить :))) вообще бы было здорово!

#9
10:24, 30 янв 2018

Daniil Petrov
Хрен с ними, со старыми системами... Но ты уверен, что на новых глюков нет?
Замучаешься же разбирать рекламации от конечных юзеров, которые драйвера не установили. И без них же все работает, не объяснишь что надо... Все работает, кроме высокоточных таймеров.

#10
11:54, 30 янв 2018

Zab
Я никогда даже не задумывался о таких пользователях, так как у самого всю жизнь было строго с драйверами, даже на монитор ставил, когда была возможность, так как с графикой работал :)
Пока разрабатываю, могу тестировать только на своём железе, а когда забабахаю первую демку, вот тогда уже дам пощупать другим, вот там и буду собирать гневные отзывы :)))

#11
14:36, 30 янв 2018

Я не знаю, я спрашиваю. Потому как, проблема то была. Очень хочется надеяться, что сейчас ее нет.
Надо сказать, с высокоточными таймерами это была не единственная проблема.
Другая проблема - они ни фига могли оказаться не высокоточными и вообще не таймерами, скакать темп тиков мог в пределах чуть ли не 20%, причем на одной машинке то ускорялся, то замедлялся, в зависимости от нагрузки. Тоже хочется надеяться что больше такой техники не выпускают, тоже хочется знать наверняка. Во времена P4 такое было, не исключено что техника тех времен еще где-то эксплуатируется.

#12
15:15, 30 янв 2018

Zab
Ну здесь я не подсказчик, сам можно сказать только взялся писать движок и только-только пересел с QueryPerformanceCounter на std::chrono::high_resolution_clock, так как первый, говорят, для мультипоточности не катит. Хотя второй меня порадовал более высокой точностью, у себя проблем я не заметил ни с тем, ни с другим.

#13
17:33, 30 янв 2018

Daniil Petrov
> QueryPerformanceCounter на std::chrono::high_resolution_clock
Можно подумать, между ними есть разница на низком уровне... Один - оболочка над другим.
QueryPerformanceCounter для многопоточности очень даже катит, если соблюсти все условия. Для std::chrono::high_resolution_clock надо соблюсти их же.
Всякие страшные предупреждения, они как раз для случая когда условия не соблюдены. Очень даже возможно, что винда семерка и более старшие сами устанавливают минимум драйверов и не страдают от неустановленных драйверов мамки. Но надо бы убедиться.

А скачущий темп таймеров был на мамках с чипсетами от via. Давненько я таких новых не видел, теперь amd-компы на чипсетах от nvidia.
Были еще нотбуки старые, на которых драйвера не компенсировали скачки тактовой частоты при переходе в режим экономии.

QueryPerformanceCounter, кстати, не для многопоточности не катит, а для многоядерных компов вообще, в самом плохом случае. Попробуй найди сейчас не многоядерный...

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

#14
21:27, 30 янв 2018

Zab
> Если все же винда сама с этой проблемой не разбирается, из этого вовсе не
> следует, что нам надо работать в плохих условиях. Надо корректно лопуха-юзера
> послать куда подальше, чтобы не выглядеть виноватым самому и не разбираться с
> каждой такой ситуацией вручную. Диагностировать проблему, отказаться работать,
> отослать устанавливать драйвера, но не глючить.
А как популярные движки в этой ситуации? Нормально себя ведут? Если да, то в этом случае геймер окажется прав! :)

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

Тема в архиве.