Я использую clock_gettime() в Linux и QueryPerformanceCounter() в Windows для измерения времени. При измерении времени я столкнулся с интересным случаем.
Во-первых, я вычисляю DeltaTime в бесконечном цикле while. Этот цикл вызывает некоторые функции обновления. Для расчета DeltaTime программа ожидает 40 миллисекунд в функции обновления, поскольку функции обновления еще пусты.
Затем в программе, скомпилированной как Win64-Debug, я измеряю DeltaTime. Это примерно 0,040f. И так продолжается до тех пор, пока программа работает (Win64-Release тоже так работает). Он работает правильно.
Но в программе, скомпилированной как Linux64-Debug или Linux64-Release, есть проблема.
Когда программа запустится. Все нормально. DeltaTime составляет примерно 0,040f. Но через некоторое время deltatime вычисляется как 0,12XXf или 0,132XX, сразу после него 0,040f. И так далее.
Я думал, что правильно использую QueryPerformanceCounter и неправильно использую clock_gettime(). Потом решил попробовать со стандартной библиотекой std::chrono::high_resolution_clock, но тоже самое. Без изменений.
#define MICROSECONDS (1000*1000)
auto prev_time = std::chrono::high_resolution_clock::now();
decltype(prev_time) current_time;
while(1)
{
current_time = std::chrono::high_resolution_clock::now();
int64_t deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(current_time - previous_time).count();
printf("DeltaTime: %f", deltaTime/(float)MICROSECONDS);
NetworkManager::instance().Update();
prev_time = current_time;
}
void NetworkManager::Update()
{
auto start = std::chrono::high_resolution_clock::now();
decltype(start) end;
while(1)
{
end = std::chrono::high_resolution_clock::now();
int64_t y = std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
if(y/(float)MICROSECONDS >= 0.040f)
break;
}
return;
}
(float)MICROSECONDS
рассмотрите возможность определенияMICROSECONDS
какfloat
. например:constexpr float MICROSECONDS = 1000*1000;
- person user4581301   schedule 02.09.2019int64_t y = std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
Лично я бы использовалauto
вместоy
. И(float)MICROSECONDS
- э-э-э, пожалуйста, не используйте приведения в стиле C. - person Jesper Juhl   schedule 02.09.2019