Я рассмотрел несколько тем, чтобы попытаться получить некоторые идеи о том, как сделать надежные часы с помощью C или C ++. Тем не менее, я также видел, как некоторые функции использовали тики и тики процессора в секунду для расчета конечного результата, что, как я думаю, может быть проблемой для процессора с автоматическим разгоном, как тот, который у меня есть. Я также видел, как через некоторое время один из них сбрасывается, поэтому он не очень надежен.
Идея состоит в том, чтобы сделать (желательно кроссплатформенные) часы, подобные игровым, с точностью лучше секунды, чтобы иметь возможность добавлять прошедшее время в «текущем сеансе» с сохраненным временем в конце. программы. Это означало бы подсчитать время, потраченное на консольную игру, в которой нет игровых часов, и в конечном итоге, возможно, интегрировать ее в реальные игры для ПК.
Он должен иметь возможность работать, не занимая слишком много или всего времени ЦП (или времени одного ядра для многоядерных ЦП), поскольку было бы довольно плохо использовать все эти ресурсы только для часов, а также в системах с автоматическим -Overclock (что в противном случае могло бы привести к неточным результатам).
Программа, в которую я хотел бы реализовать эту функцию, в настоящее время выглядит так, но я мог бы перекодировать ее на C (поскольку мне нужно вернуться к изучению того, как кодировать на C ++):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
Кстати, мне все еще нужно избавиться от функции PAUSE, специфичной для Windows, но я думаю, что об этом можно позаботиться с помощью простого цикла while (char! = '\ N').
Что я уже бегло просмотрел:
- Использование clock () для измерения времени выполнения
- Расчет прошедшего времени в программе C в миллисекундах
- Метка времени на языке программирования C
- Время выполнения программы C
- C: использование clock () для измерения времени в многопоточном многопоточные программы
- Гарантировано ли разрешение gettimeofday () микросекунды?
- Как измерить время в миллисекундах с помощью ANSI C?
- Межплатформенный таймер высокого разрешения C ++
- Функция таймера для определения времени в наносекундах с использованием C ++ а>
- Как измерить время процессора и время настенных часов?
- Как измерить Время процессора и время настенных часов в Linux / Windows?
- как измерить время?
- разрешение std :: chrono :: high_resolution_clock не соответствует измерения
- C ++ Как сделать таймер точным в Linux
- http://gameprogrammingpatterns.com/game-loop.html
- точность часов ()
- std :: chrono, похоже, не дает точных тактовое разрешение / частота
- функция часов в C ++ с потоками
(Изменить: дополнительные исследования, в частности, для реализации C:
- Кросс-платформенная реализация высокоточного таймера событий C ++ (нет реального ответа )
- Расчет времени функции в наносекундах в коде C (Windows)
- Как распечатать разницу во времени с точностью до миллисекунд и наносекунды? (может быть лучшим ответом для реализации на C)
- Как получить продолжительность в виде int milli's и плавающие секунды из ‹chrono›? (снова C ++))
Проблема в том, что неясно, правильно ли работают некоторые из упомянутых методов, такие как Boost или SDL2, в частности, с автоматическим разгоном.
TL; DR: какую кросс-платформенную функцию мне следует использовать для создания точного счетчика с точностью до секунды на C / C ++, который мог бы работать на многоядерных процессорах и / или процессорах с автоматическим разгоном, пожалуйста?
Заранее спасибо.
std::chrono::steady_clock
ни на что не устанавливается. В любой момент он сообщает вам значение часов. Вам решать, измерить часы в начале и в конце интервала и соответственно вычислить прошедшее время. - person Sam Varshavchik   schedule 26.12.2017std::chrono::steady_clock
- это монотонно увеличивающиеся часы, на которые не влияют внешние факторы, такие как скорость процессора или пользовательские настройки даты / времени или аналогичные - да. - person Jesper Juhl   schedule 26.12.2017clock_gettime()
достаточно ли надежен (и портативен)? - person Coroice   schedule 27.12.2017omp_get_wtime()
- это то, что я обычно использую. - person Z boson   schedule 27.12.2017omp_get_wtime()
похоже, зависит от настенных часов и имеет разрешение секунды; в некоторых случаях этого достаточно, но не совсем то, что я искал. Кроме того, похоже, что он может измерять эффективное время выполнения, а не иметь продолжительность между двумя точками времени (в начале и в конце программы соответственно).omp_get_wtick()
может быть лучше для субсекундной точности, но опять же, совместим ли он с автоматическим разгоном? - person Coroice   schedule 27.12.2017omp_get_wtick()
, похоже, также имеет разрешение секунды, так что это подходит не для всех случаев ... - person Coroice   schedule 27.12.2017omp_get_wtime()
имеет разрешение лучше микросекунды. Не знаю, откуда вы взяли, что у него разрешение секунды. На самом деле он просто вызывает другие функции. В GCC он вызываетclock_gettime
. Его реализация определена, но для меня она была точной. Это наиболее удобный кроссплатформенный и кросс-компиляторный (GCC, Claing, ICC, MSVC) метод, который я знаю, чтобы получить время стены. Я бы не стал использовать его для большого проекта, но для мелочей (особенно на SO) он отлично работает. Однажды у меня была одна проблема, хотя stackoverflow.com/a/43277581/2542702 - person Z boson   schedule 28.12.2017clock_gettime
, похоже, тоже работает монотонно, поэтому auto-OC не должен вызывать проблем ... Большое спасибо за разъяснения, я буду помнить об этой функции для проектов C! - person Coroice   schedule 05.01.2018