Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перерисовка "до востребования"

16K
07 марта 2006 года
Machaon
6 / / 07.03.2006
Добрый вечер!
Пишу прогу: вывод анимации, а точнее отрисовка в реальном времени некоторого процесса (кстати очень похоже на игру - сделать шаг, обновить кадр, сделать шаг и т.д.). Перерисовку делает отдельный поток, причём функциями API. Никаких специальных графических библиотек использовать не хочу.
Проблема: в секунду генерируется несколько сотен кадров, экран обновляется не так часто...

Существуют ли в API функции, позволяющие определить, обновился кадр или нет?
Или, вероятно, существуют другие способы осуществлять прорисовку не чаще раза за такт обновления экрана?
534
07 марта 2006 года
HarryAxe
448 / / 19.01.2006
Ну используй fps и задержку с помощью Sleep(1000/fps), и там с помощью GetTickCount() выясняй точнее сколько времени прошло.
16K
08 марта 2006 года
Machaon
6 / / 07.03.2006
Цитата:
Originally posted by HarryAxe
Ну используй fps и задержку с помощью Sleep(1000/fps), и там с помощью GetTickCount() выясняй точнее сколько времени прошло.



Т.е. проверяю сколько времени прошло и если достаточно, то отрисовываю, иначе - нет.
HarryAxe, спасибо - это выход, но, так сказать "своими силами".

А есть более стандартные способы?
Может быть можно узнать сколько рас перерисовывался экран, или есть какой-нить стандартный именованный объект синхронизации, сигнализирующий об очередной перерисовке?

По-моему (вот токлько не уверен) DirectDraw это делать умеет. Но как?

534
08 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Machaon
Т.е. проверяю сколько времени прошло и если достаточно, то отрисовываю, иначе - нет.
HarryAxe, спасибо - это выход, но, так сказать "своими силами".

А есть более стандартные способы?
Может быть можно узнать сколько рас перерисовывался экран, или есть какой-нить стандартный именованный объект синхронизации, сигнализирующий об очередной перерисовке?

По-моему (вот токлько не уверен) DirectDraw это делать умеет. Но как?

DirectDraw приложения перересовывают эткран так быстро, как только смогут, не забивая производительность. Для таких приложений чем выше fps - тем лучше. Если ты не собираешься выводить качественное видео, тебе вполне подойдёт фиксированное значение fps = 25. А вообще говоря, что ты подразумеваешь под частотой перерисовки? Частоту обновления монитора? Ну это 50-100 Hz (соответственно, в идеале это 50-100 fps). Частоту перерисовки непосредственно окон? Окна перерисовываются так часто, как это необходимо (то есть, например, при изменении размеров окна или при закрытии одним окном области другого). Если никаких вмешательств со стороны пользователя нет, то сами по себе окна перерисовываться не будут вообще

16K
08 марта 2006 года
Machaon
6 / / 07.03.2006
Я вывожу анимацию. Под частотой обновления подразумеваю
СвойстваЭкрана->Дополнительно->Монитор->60Гц
(у меня на компе). Т.е. кол-во кадров за секунду, которое монитор реально покажет пользователю.
Если кол-во кадров, которое я сгенирирую будет выше, то для пользователя часть из них потеряется, он их так и не увидит. А вычислительный ресурс при этом расходуется. Я вполне способен найти ему лучшее применение.

Хочу добиться следующего:
Прога рассчитывает шаги (сделать шаг, сделать шаг, сделать шаг...), пока не случится, что экран обновился. После этого она рисует текущее состояние (перерисовать), а потом опять делает шаги, до следующего обновления.

В директе есть возможность синхронизировать частоту вызова функции перерисовки и частоту обновления экрана.
534
08 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Machaon
Хочу добиться следующего:
Прога рассчитывает шаги (сделать шаг, сделать шаг, сделать шаг...), пока не случится, что экран обновился. После этого она рисует текущее состояние (перерисовать), а потом опять делает шаги, до следующего обновления.

В директе есть возможность синхронизировать частоту вызова функции перерисовки и частоту обновления экрана.

В directx ты просто можешь явно получить/назначить частоту обновления кадров монитором. Вспомним, что оптимальная скорость обновления кадров видео - всего 24 кадра в секунду. Больше 30 fps использовать уже не имеет смысла (если только у тебя там нет каких-нибудь забубённых спецэффектов). Но, и вне DirectX ты можешь узнать частоту обновления кадров монитора: EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, lpDevMode); Поле dmDisplayFrequency структуры DEVMODE как раз указывает частоу регенерации. Только зачем так часто обновлять?

16K
08 марта 2006 года
Machaon
6 / / 07.03.2006
Цитата:
Originally posted by HarryAxe
В directx ты просто можешь явно получить/назначить частоту обновления кадров монитором. Вспомним, что оптимальная скорость обновления кадров видео - всего 24 кадра в секунду. Больше 30 fps использовать уже не имеет смысла (если только у тебя там нет каких-нибудь забубённых спецэффектов). Но, и вне DirectX ты можешь узнать частоту обновления кадров монитора: EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, lpDevMode); Поле dmDisplayFrequency структуры DEVMODE как раз указывает частоу регенерации. Только зачем так часто обновлять?



Угу... Значит поставлю регулируемый (пользователем) фпс и буду следить за временем (Sleep правда мне не нужен - когда не рисует пусть просто считает). Спасибо!

534
09 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Machaon
Угу... Значит поставлю регулируемый (пользователем) фпс и буду следить за временем (Sleep правда мне не нужен - когда не рисует пусть просто считает). Спасибо!

Ну, Sleep() тебе всё равно понадобится, чтобы не загружать проц на 100 %

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог