| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Проблемы со скоростью отображения на экране |
| Автор: iZZi 29.9.2005, 17:07 |
| Здавствуйте! У меня есть некая программа, выводящая на экран несколько объектов с использованием DirectDraw. В общем, суть проблемы в том, что иногда скорость (можно сказать - FPS) программы зависит от того, двигается ли мышка в данный момент или нет. Причем, если мышка двигается, то FPS увеличивается (!). Подробнее о программе. Программа выполняется fullscreen, поэтому постоянно приходят сообщения WM_PAINT. На каждое такое сообщение приходится один флип (то есть одно отображение вторичного буфера на первичную плоскость, если кто не знает Перед запуском fullscreen устанавливается таймер Windows, по которому должны изменяться положения объектов. Но во время выполнения программы ни разу не приходят сообщения WM_TIMER. Я изменил код и стал просто вызывать каждый раз в главном цикле GetTickCount() и сравнивать с предыдущим значением. Если наступает нужный момент, то выполняется перемещение объектов. Можно включать и выключать дополнительные функции отображения(математические расчеты; не буду рассказывать, это не суть важно), при этом FPS заметно падает. Если через некоторое время это отображение выключить, то появляется этот глюк: в моменты, когда мышка перемещается, FPS увеличивается примерно на 30-50%. Через некоторое время глюк исчезает и программа работает независимо от движения мыши. Вот кусок кода (синтаксис паскалевский, но все должно быть понятно repeat CheckTimer; if GetMessage(Msg, 0, 0, 0) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; until Msg.Msg = WM_QUIT; Подскажите, может кто-то уже с этим сталкивался? P.S. Если что, могу скинуть .exe (34K незапакованный) |
| Автор: _hunter 29.9.2005, 17:23 |
| GetMessage() в случае отсутсвия сообщений просто _замораживается_ используй вместо нее PeekMessage() |
| Автор: iZZi 29.9.2005, 20:32 | ||
_hunter
это не мой случай. сообщений хватает всегда К тому же, я пробовал и PeekMessage. Результат тот же. Разница между GetMessage() и PeekMessage() в том, что последняя проверяет очередь сообщений, и если там что-то есть, берет оттуда сообщение. Но что важнее, PeekMessage() удаляет из очереди сообщения WM_PAINT, в отличие от GetMessage(). Может быть, стоит сделать раздельными потоки ввода и отображения? Или все, как всегда, проще? |
| Автор: Mad 29.9.2005, 22:33 | ||||||||
iZZi
разницы у тебя нет, потому что ты немного неправильно делаеш основной цикл программы для DirectDraw fullscreen это должно выглядеть примерно так (извени, синтакс с++ как и раздел, но думаю поймеш
вот так FPS будет соответствовать возможностям твоего железа
а это не факт |
| Автор: _hunter 30.9.2005, 10:48 | ||||||||||
откуда инфа?
видать не так пробовал...
а еще разница в том ( что для тебя важнее ), что при отсутсвии оных первая замирает, а вторая продолжает работать
а это, как раз ( в данном случае ) и не важно... |
| Автор: iZZi 2.10.2005, 11:58 | ||
_hunter
инфа из лог-файла. Насчет того, что WM_PAINT не приходят постоянно, я уже сам разобрался. WM_PAINT просто не удаляется из очереди. я использую PeekMessage. Mad, синтаксис с++ каждый день в хэлпе вижу, так что, наверное, разберусь попробую твой вариант. |
| Автор: iZZi 5.10.2005, 17:21 |
| Товарищи! Спешу сообщить вам, что проблема решена, причем глюк скрывался совсем не там, где я его искал (и просил вас Точнее, не совсем не там. Проблема была в том, что у меня накапливались задержки во время отображения гравитации, и потом прога работала с нормальным (и постоянным) FPS, а при движении мышки просто быстрее обычного изменялись положения объектов. Всем спасибо! P.S. Люди, будьте внимательнее, не берите с меня пример P.P.S. тему можно закрывать, наверное |
| Автор: Romikgy 6.10.2005, 09:13 | ||
Почему??? |
| Автор: iZZi 7.10.2005, 15:18 | ||||
1 - вариант без глюка:
2 - вариант с этим глюком:
За синтаксис прошу не пинать - сам пишу на delphi, никак на цпп не перейду Если в варианте с глюком на несколько секунд включить гравитацию, а потом выключить, то при движении мышки двигаться все будет быстрее. Особенно заметно при коротких движениях мышки. Насчет того, почему быстрее изменялись положения объектов, мои предположения не подтвердились, так что глюк исправлен, но причина не найдена :\ Вот архив с двумя версиями проги (1.121 и 1.122 - cоответственно с глюком и без него) P.S. я пока не проверял, но может, прога и не запустится на другом компе |