Используя обычный старый timeGetTime()
, чтобы сделать
сроки не надежны на многих
Операционные системы на базе Windows
потому что гранулярность системы
таймер может достигать 10-15
миллисекунды, что означает, что
timeGetTime()
только с точностью до
10-15 миллисекунд. [Обратите внимание, что
высокая зернистость наблюдается на основе NT
операционные системы, такие как Windows NT,
2000 и XP. Windows 95 и 98 склонны
иметь гораздо лучшую зернистость,
около 1-5 мс.]
Однако, если вы позвоните
timeBeginPeriod(1)
в начале
ваша программа (и timeEndPeriod(1)
в
конец), timeGetTime()
будет обычно
с точностью до 1-2 миллисекунд,
и предоставит вам чрезвычайно
точная информация о времени.
Sleep()
ведет себя аналогично; длина
времени, которое на самом деле Sleep()
спит
идет рука об руку с
зернистость timeGetTime()
, поэтому после
позвонив timeBeginPeriod(1)
один раз,
Sleep(1)
будет на самом деле спать 1-2
миллисекунды, Sleep(2)
на 2-3, и так
на (вместо того, чтобы спать в приращениях
10-15 мс).
Для более точной синхронизации
(с точностью до миллисекунды), вы будете
вероятно, хотите избежать использования
Мнемоническая сборка RDTSC, потому что это
трудно калибровать ; вместо этого используйте
QueryPerformanceFrequency
и
QueryPerformanceCounter
, которые
с точностью до 10 микросекунд
(0,00001 секунды).
Для простой синхронизации оба timeGetTime
и QueryPerformanceCounter работают хорошо,
и QueryPerformanceCounter - это
очевидно точнее. Однако если
вам нужно сделать любой вид
паузы "(такие, которые необходимы для
ограничение частоты кадров), вы должны быть
осторожно сидеть в цикле вызова
QueryPerformanceCounter, ожидая
это достичь определенной ценности; это будет
съешь 100% своего процессора.
Вместо этого рассмотрим гибридную схему,
где вы звоните Sleep (1) (не забудьте
timeBeginPeriod (1) first!) всякий раз, когда
вам нужно пройти более 1 мс
время, а затем только введите
QueryPerformanceCounter 100% - занятая петля
прикончить последнюю <1/1000-ую
вторая задержка вам нужна. это
даст вам сверхточные задержки
(с точностью до 10 микросекунд), с
очень минимальное использование процессора. См код
выше. </p>