На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Контроль скорости игры
    Сто лет не занимался игроделом. Сейчас создаю игру по мотивам старой игрушки с советского компьютера. Пишу под DirectX, а если точнее, то под DirectDraw. Вплоть до Windows XP для контроля скорости хватало функции timeGetTime() и timeBeginPeriod() из модуля WINMM.DLL. Однако сейчас столкнулся с тем, что точность функции различается на разных ОС и железе. Если на XP можно задать частоту тиков в 1 мс, то под семеркой это уже не прокатит и частоту можно задать с точностью миллисекунд в пять. Да и под десяткой схожая картина.
    Понимаю, что отстал от жизни. В связи с чем возник вопрос. А как сегодня контролируют скорость игры? Мне вот нужно установить фиксированные 40 или 60 fps. Однако, из-за различного поведения timeBeginPeriod() под различными ОС как то нет уверенности, что код отработает одинаково на всех ОС.
    Пробовал через синхронизацию с вертикальной разверткой экрана, но оказалось, что это тоже работает не на всех системах. В частности, на ноуте с семеркой почему-то частота раза в два меньше чем на десктопном ПК, хотя в настройках стоят те же 60 герц.
      hpet?
        Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32".
          Цитата Mikle @
          Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32".

          Емнип это rdtsc, а у него имеются известные проблемы c cpu perfomance scaling
          Сообщение отредактировано: Gonarh -
            Цитата Gonarh @
            hpet?
            Спасибо, но немного не то. Мне нужна совместимость с XP.

            Цитата Mikle @
            Для очень высокой точности можно использовать QueryPerformanceFrequency() и QueryPerformanceCounter() из "kernel32".
            Спасибо, попробую.

            Цитата Gonarh @
            Емнип это rdtsc, а у него имеются известные проблемы c cpu perfomance scaling
            Можно в двух словах о сути проблемы?

            -------------------------------------
            Тут вот подумалось, а что если для timeBeginPeriod() задавать интервал побольше. Скажем, для 60 fps можно задать 1000/60 = 16 мс. В связи с чем вопрос: какой интервал таймера точно будет работать на всех ОС? Что-то у микрософта плохо с описанием, этой функции.
              Eretic, на сколько я понял из когда-то прочитанного, проблема в зависимости частоты QueryPerformanceFrequency() от тактовой частоты процессора. А последняя в современных процессорах может меняться в зависимости от нагрузки. То есть нужно каждый раз, опрашивая QueryPerformanceCounter(), опрашивать и QueryPerformanceFrequency(). И даже с таким алгоритмом результат замера, в течение которого произошла смена частоты, окажется немного неверным потому, что мы не знаем в какой именно момент между замерами произошла эта смена. Но эта ошибка всего на один замер.
              На практике - я много лет пользуюсь этим счётчиком, проверял на многих компьютерах, и мне не попадался случай, чтобы это произошло, то есть частота процессора менялась, а частота QueryPerformanceFrequency() оставалась прежней.
              Сообщение отредактировано: Mikle -
                Ясно. Бум пробовать :)
                  Цитата Eretic @
                  Можно в двух словах о сути проблемы?

                  Mikle всё описал.
                  Цитата Eretic @
                  а что если для timeBeginPeriod() задавать интервал побольше. Скажем, для 60 fps можно задать 1000/60 = 16 мс.

                  Емнип, 64 прерывания в секунду. Следовательно максимум 15,6. Вот струмент

                  Добавлено
                  Цитата Eretic @
                  Мне нужна совместимость с XP.

                  А, струмент не поможет, он юзает GetSystemTimeAdjustment который появился в висте.
                  Сообщение отредактировано: Gonarh -
                    <cut>
                    Проблема решилась написанием аналога BltFast().
                    Сообщение отредактировано: Eretic -
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script Execution time: 0,0853 ]   [ 14 queries used ]   [ Generated: 2.12.20, 18:25 GMT ]