Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.59.165] |
|
Сообщ.
#1
,
|
|
|
Сто лет не занимался игроделом. Сейчас создаю игру по мотивам старой игрушки с советского компьютера. Пишу под DirectX, а если точнее, то под DirectDraw. Вплоть до Windows XP для контроля скорости хватало функции timeGetTime() и timeBeginPeriod() из модуля WINMM.DLL. Однако сейчас столкнулся с тем, что точность функции различается на разных ОС и железе. Если на XP можно задать частоту тиков в 1 мс, то под семеркой это уже не прокатит и частоту можно задать с точностью миллисекунд в пять. Да и под десяткой схожая картина.
Понимаю, что отстал от жизни. В связи с чем возник вопрос. А как сегодня контролируют скорость игры? Мне вот нужно установить фиксированные 40 или 60 fps. Однако, из-за различного поведения timeBeginPeriod() под различными ОС как то нет уверенности, что код отработает одинаково на всех ОС. Пробовал через синхронизацию с вертикальной разверткой экрана, но оказалось, что это тоже работает не на всех системах. В частности, на ноуте с семеркой почему-то частота раза в два меньше чем на десктопном ПК, хотя в настройках стоят те же 60 герц. |
Сообщ.
#2
,
|
|
|
hpet?
|
Сообщ.
#3
,
|
|
|
Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32".
|
Сообщ.
#4
,
|
|
|
Цитата Mikle @ Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32". Емнип это rdtsc, а у него имеются известные проблемы c cpu perfomance scaling |
Сообщ.
#5
,
|
|
|
Цитата Gonarh @ Спасибо, но немного не то. Мне нужна совместимость с XP.hpet? Цитата Mikle @ Спасибо, попробую. Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32". Цитата Gonarh @ Можно в двух словах о сути проблемы?Емнип это rdtsc, а у него имеются известные проблемы c cpu perfomance scaling ------------------------------------- Тут вот подумалось, а что если для timeBeginPeriod() задавать интервал побольше. Скажем, для 60 fps можно задать 1000/60 = 16 мс. В связи с чем вопрос: какой интервал таймера точно будет работать на всех ОС? Что-то у микрософта плохо с описанием, этой функции. |
Сообщ.
#6
,
|
|
|
Eretic, на сколько я понял из когда-то прочитанного, проблема в зависимости частоты QueryPerformanceFrequency() от тактовой частоты процессора. А последняя в современных процессорах может меняться в зависимости от нагрузки. То есть нужно каждый раз, опрашивая QueryPerformanceCounter(), опрашивать и QueryPerformanceFrequency(). И даже с таким алгоритмом результат замера, в течение которого произошла смена частоты, окажется немного неверным потому, что мы не знаем в какой именно момент между замерами произошла эта смена. Но эта ошибка всего на один замер.
На практике - я много лет пользуюсь этим счётчиком, проверял на многих компьютерах, и мне не попадался случай, чтобы это произошло, то есть частота процессора менялась, а частота QueryPerformanceFrequency() оставалась прежней. |
Сообщ.
#7
,
|
|
|
Ясно. Бум пробовать
|
Сообщ.
#8
,
|
|
|
Цитата Eretic @ Можно в двух словах о сути проблемы? Mikle всё описал. Цитата Eretic @ а что если для timeBeginPeriod() задавать интервал побольше. Скажем, для 60 fps можно задать 1000/60 = 16 мс. Емнип, 64 прерывания в секунду. Следовательно максимум 15,6. Вот струмент Добавлено Цитата Eretic @ Мне нужна совместимость с XP. А, струмент не поможет, он юзает GetSystemTimeAdjustment который появился в висте. |
Сообщ.
#9
,
|
|
|
<cut>
Проблема решилась написанием аналога BltFast(). |