Ахтунг! Эта статья была написана в 2013. Она описывает проблему, которая акуальна для ПО и железа, бывшего в ходу в то смутное время. Часть информации уже устарела.
Не так давно на нашем форуме в
теме обсуждения игры Battlefield 3 всплыл очередной твик, якобы способный улучшить игру по сети. Игроки вообще очень любят "волшебные" твики, а сетевые игроки-задроты на них просто молятся, замечая улучшения, которых
на самом деле нет. Так мы имеем дело с очередным плацебо? И да, и нет.
Судя по гуглу, кашу заварил пользователь unclewebb, который поместил на форум
вот это сообщение. unclewebb не сетевой игрок, а технически грамотный чел, автор очень полезного утиля
ThrottleStop. Ему можно доверять. :) В сообщении идет речь об исправлении ошибки, которая может появится, если процессор разогнан с помощью SetFSB или другого утиля, изменяющего частоту системной шины. В этом случае приложения, которые используют функции
QueryPerformanceCounter и
QueryPerformanceFrequency, начинают неправильно измерять прошедшее время. Автор привел пример, где величина ошибки измерения составила 5%. В том же сообщении есть ссылка на утиль WinTimerTester, который позволяет быстро определить наличие проблемы.
"Твик" исправляет вполне определенную ошибку, которая есть на очень малом количестве компьютеров. Во-первых, для появления ошибки венда должна использовать для расчета прошедшего времени команду
TSC процессора. Будет TSC использоваться или нет зависит от версии венды, ее настроек и конфигурации железа. Во-вторых, частота шины должна изменяться программно в обход BIOS и венды, например с помощью SetFSB. Некоторые утили, которые поставляются в комплекте с материнскими платами, не меняют частоту напрямую, а заставляют это сделать BIOS после перезагрузки. В любом случае, с помощью WinTimerTester ошибку легко обнаружить: после нажатия на кнопку Start через 100 сек разница между значениями QueryPerformanceCounter и GetTickCount должна составит больше десятой секунды. Чаще всего оба значения будут равны. В этом случае все работает нормально и твик не нужен.
На это мне возразят, что после твика частота QueryPerformanceFrequency возросла с 3 МГц до 14 МГц, а значит таймер будет отмерять время более точно. И ошибутся.
- Функция QueryPerformanceCounter не имеет отношения к таймеру. Это высокоточный счетчик, с помощью которого измеряют уже прошедшее время, как правило небольшой длительности. А HPET Windows 7 использует в качестве таймера без всяких твиков, это можно проверить с помощью функции NtQueryTimerResolution или измерив задержки в LatencyMon.
- Если в QueryPerformanceCounter используется TSC, то реальная частота выше 3 МГц.
- 3 Мгц - это примерно 3000000 отсчетов за одну секунду. Такой точности хватит с головой. Почувствовать разницу между 3 МГц и 14 МГц не сможет даже робот. :)
Как видно, плюсов от твика на нормально работающем компьютере нет, а вот минусы имеются. Например, чтение HPET занимает заметно больше времени, чем чтение TSC. Не зря useplatformclock по-умолчанию отключен. Для любителей волшебных твиков советую баловаться с гипертрейдингом. Его включение или отключение творит чудеса: улучшается "рега", уменьшается пинг, в проводах рассасываются скрутки, и т.д.