Я считаю, что это все еще полезно: Внутренние компоненты системы: рекомендации по обеспечению поддержки мультимедийного таймера .
Он хорошо объясняет различные доступные таймеры и их ограничения. Возможно, ваше заклятое враг будет не столько разрешением, сколько задержкой.
QueryPerformanceCounter не всегда будет работать на скорости процессора. Фактически, он может попытаться избежать RDTSC , особенно в многопроцессорных (/ многоядерных) системах: он будет использовать HPET в Windows Vista и более поздних версиях, если она доступна или таймер ACPI / PM .
В моей системе (Windows 7 x64, двухъядерный AMD) таймер работает на частоте 14,31818 МГц.
То же самое верно для более ранних систем:
По умолчанию Windows Server 2003 с пакетом обновления 2 (SP2) использует таймер PM для всех мультипроцессорных HAL APIC или ACPI, если только процесс проверки для определения того, поддерживает ли BIOS APIC или HAL ACPI, не проходит. "
Проблема в том, что проверка не удалась. Это просто означает, что ваш компьютер / BIOS поврежден. Затем вы можете либо исправить свой BIOS (рекомендуется), либо хотя бы переключиться на использование таймера ACPI (/ usepmtimer) на данный момент.
В C # легко - без P / Invoke - проверить поддержку таймера высокого разрешения с помощью Stopwatch.IsHighResolution
, а затем посмотреть на Stopwatch.Frequency
. Это сделает необходимый вызов QueryPerformanceCounter внутри.
Также учтите, что если таймеры сломаны, вся система будет разрушена и, в целом, будет вести себя странно, сообщая об отрицательных прошедших временах, замедляя и т. Д. - не только ваше приложение.
Это означает, что вы можете положиться на QueryPerformanceCounter.
... и вопреки распространенному мнению, QueryPerformanceFrequency()
"не может измениться во время работы системы" .
Редактировать: Как указано в документации по QueryPerformanceCounter()
, «не должно иметь значения, какой процессор вызывается» - и фактически весь взлом с привязкой к потоку необходим, только если обнаружение APIC / ACPI происходит сбой, и система использует TSC . Это курорт, который не должен происходить. Если это происходит в более старых системах, вероятно, имеется обновление BIOS / исправление драйвера от производителя. Если его нет, загрузочный переключатель /usepmtimer
все еще там. Если и это не помогает, поскольку система не имеет надлежащего таймера, кроме Pentium TSC, вы можете рассмотреть возможность связывания с привязкой потоков - даже тогда пример, предоставленный другими в области «Содержимое сообщества» на странице, вводит в заблуждение, поскольку имеет незначительные накладные расходы из-за установки соответствия потоков при каждом вызове пуска / останова, что вносит значительную задержку и, вероятно, уменьшает преимущества использования таймера с высоким разрешением.
Игровые таймеры и многоядерные процессоры - это рекомендации по их правильному использованию. Пожалуйста, учтите, что ему сейчас пять лет, и в то время меньшее количество систем полностью поддерживало / поддерживало ACPI - вот почему при его создании в статье так подробно рассказывается о TSC и о том, как обойти это. его ограничения, сохраняя аффинный поток.
Я считаю, что в настоящее время довольно сложно найти обычный ПК с нулевой поддержкой ACPI и без таймера PM. Наиболее распространенным случаем, вероятно, являются настройки BIOS, когда поддержка ACPI установлена неправильно (иногда, к сожалению, по умолчанию).
Анекдоты сообщают , что восемь лет назад ситуация была иной в редких случаях. (Читает весело, разработчики работают над «недостатками» дизайна и проектируют чип-чипы. Если быть честным, то может быть так же, и наоборот.: -)