Перерисовка "до востребования"
Пишу прогу: вывод анимации, а точнее отрисовка в реальном времени некоторого процесса (кстати очень похоже на игру - сделать шаг, обновить кадр, сделать шаг и т.д.). Перерисовку делает отдельный поток, причём функциями API. Никаких специальных графических библиотек использовать не хочу.
Проблема: в секунду генерируется несколько сотен кадров, экран обновляется не так часто...
Существуют ли в API функции, позволяющие определить, обновился кадр или нет?
Или, вероятно, существуют другие способы осуществлять прорисовку не чаще раза за такт обновления экрана?
Ну используй fps и задержку с помощью Sleep(1000/fps), и там с помощью GetTickCount() выясняй точнее сколько времени прошло.
Т.е. проверяю сколько времени прошло и если достаточно, то отрисовываю, иначе - нет.
HarryAxe, спасибо - это выход, но, так сказать "своими силами".
А есть более стандартные способы?
Может быть можно узнать сколько рас перерисовывался экран, или есть какой-нить стандартный именованный объект синхронизации, сигнализирующий об очередной перерисовке?
По-моему (вот токлько не уверен) DirectDraw это делать умеет. Но как?
Т.е. проверяю сколько времени прошло и если достаточно, то отрисовываю, иначе - нет.
HarryAxe, спасибо - это выход, но, так сказать "своими силами".
А есть более стандартные способы?
Может быть можно узнать сколько рас перерисовывался экран, или есть какой-нить стандартный именованный объект синхронизации, сигнализирующий об очередной перерисовке?
По-моему (вот токлько не уверен) DirectDraw это делать умеет. Но как?
DirectDraw приложения перересовывают эткран так быстро, как только смогут, не забивая производительность. Для таких приложений чем выше fps - тем лучше. Если ты не собираешься выводить качественное видео, тебе вполне подойдёт фиксированное значение fps = 25. А вообще говоря, что ты подразумеваешь под частотой перерисовки? Частоту обновления монитора? Ну это 50-100 Hz (соответственно, в идеале это 50-100 fps). Частоту перерисовки непосредственно окон? Окна перерисовываются так часто, как это необходимо (то есть, например, при изменении размеров окна или при закрытии одним окном области другого). Если никаких вмешательств со стороны пользователя нет, то сами по себе окна перерисовываться не будут вообще
СвойстваЭкрана->Дополнительно->Монитор->60Гц
(у меня на компе). Т.е. кол-во кадров за секунду, которое монитор реально покажет пользователю.
Если кол-во кадров, которое я сгенирирую будет выше, то для пользователя часть из них потеряется, он их так и не увидит. А вычислительный ресурс при этом расходуется. Я вполне способен найти ему лучшее применение.
Хочу добиться следующего:
Прога рассчитывает шаги (сделать шаг, сделать шаг, сделать шаг...), пока не случится, что экран обновился. После этого она рисует текущее состояние (перерисовать), а потом опять делает шаги, до следующего обновления.
В директе есть возможность синхронизировать частоту вызова функции перерисовки и частоту обновления экрана.
Хочу добиться следующего:
Прога рассчитывает шаги (сделать шаг, сделать шаг, сделать шаг...), пока не случится, что экран обновился. После этого она рисует текущее состояние (перерисовать), а потом опять делает шаги, до следующего обновления.
В директе есть возможность синхронизировать частоту вызова функции перерисовки и частоту обновления экрана.
В directx ты просто можешь явно получить/назначить частоту обновления кадров монитором. Вспомним, что оптимальная скорость обновления кадров видео - всего 24 кадра в секунду. Больше 30 fps использовать уже не имеет смысла (если только у тебя там нет каких-нибудь забубённых спецэффектов). Но, и вне DirectX ты можешь узнать частоту обновления кадров монитора: EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, lpDevMode); Поле dmDisplayFrequency структуры DEVMODE как раз указывает частоу регенерации. Только зачем так часто обновлять?
В directx ты просто можешь явно получить/назначить частоту обновления кадров монитором. Вспомним, что оптимальная скорость обновления кадров видео - всего 24 кадра в секунду. Больше 30 fps использовать уже не имеет смысла (если только у тебя там нет каких-нибудь забубённых спецэффектов). Но, и вне DirectX ты можешь узнать частоту обновления кадров монитора: EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, lpDevMode); Поле dmDisplayFrequency структуры DEVMODE как раз указывает частоу регенерации. Только зачем так часто обновлять?
Угу... Значит поставлю регулируемый (пользователем) фпс и буду следить за временем (Sleep правда мне не нужен - когда не рисует пусть просто считает). Спасибо!
Угу... Значит поставлю регулируемый (пользователем) фпс и буду следить за временем (Sleep правда мне не нужен - когда не рисует пусть просто считает). Спасибо!
Ну, Sleep() тебе всё равно понадобится, чтобы не загружать проц на 100 %