![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
iZZi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 22.5.2003 Репутация: нет Всего: нет |
Здавствуйте!
У меня есть некая программа, выводящая на экран несколько объектов с использованием 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
GetMessage() в случае отсутсвия сообщений просто _замораживается_ используй вместо нее PeekMessage()
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
iZZi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 22.5.2003 Репутация: нет Всего: нет |
_hunter
это не мой случай. сообщений хватает всегда ![]() К тому же, я пробовал и PeekMessage. Результат тот же. Разница между GetMessage() и PeekMessage() в том, что последняя проверяет очередь сообщений, и если там что-то есть, берет оттуда сообщение. Но что важнее, PeekMessage() удаляет из очереди сообщения WM_PAINT, в отличие от GetMessage(). Может быть, стоит сделать раздельными потоки ввода и отображения? Или все, как всегда, проще? ![]() |
|||
|
||||
Mad |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
iZZi
разницы у тебя нет, потому что ты немного неправильно делаеш основной цикл программы для DirectDraw fullscreen это должно выглядеть примерно так (извени, синтакс с++ как и раздел, но думаю поймеш ![]()
вот так FPS будет соответствовать возможностям твоего железа
а это не факт ![]() |
||||||||
|
|||||||||
_hunter |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
откуда инфа?
видать не так пробовал...
а еще разница в том ( что для тебя важнее ), что при отсутсвии оных первая замирает, а вторая продолжает работать
а это, как раз ( в данном случае ) и не важно... -------------------- Tempora mutantur, et nos mutamur in illis... |
||||||||||
|
|||||||||||
iZZi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 22.5.2003 Репутация: нет Всего: нет |
_hunter
инфа из лог-файла. Насчет того, что WM_PAINT не приходят постоянно, я уже сам разобрался. WM_PAINT просто не удаляется из очереди. я использую PeekMessage. Mad, синтаксис с++ каждый день в хэлпе вижу, так что, наверное, разберусь ![]() попробую твой вариант. |
|||
|
||||
iZZi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 22.5.2003 Репутация: нет Всего: нет |
Товарищи!
Спешу сообщить вам, что проблема решена, причем глюк скрывался совсем не там, где я его искал (и просил вас ![]() Точнее, не совсем не там. Проблема была в том, что у меня накапливались задержки во время отображения гравитации, и потом прога работала с нормальным (и постоянным) FPS, а при движении мышки просто быстрее обычного изменялись положения объектов. Всем спасибо! P.S. Люди, будьте внимательнее, не берите с меня пример ![]() P.P.S. тему можно закрывать, наверное |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 7 Всего: 146 |
Почему??? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
iZZi |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 22.5.2003 Репутация: нет Всего: нет |
1 - вариант без глюка:
2 - вариант с этим глюком:
За синтаксис прошу не пинать - сам пишу на delphi, никак на цпп не перейду Если в варианте с глюком на несколько секунд включить гравитацию, а потом выключить, то при движении мышки двигаться все будет быстрее. Особенно заметно при коротких движениях мышки. Насчет того, почему быстрее изменялись положения объектов, мои предположения не подтвердились, так что глюк исправлен, но причина не найдена :\ Вот архив с двумя версиями проги (1.121 и 1.122 - cоответственно с глюком и без него) P.S. я пока не проверял, но может, прога и не запустится на другом компе ![]() Присоединённый файл ( Кол-во скачиваний: 0 ) ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |