2010-10-12 5 views
3

Итак, я использую D3D в оконном приложении.Как включить VSYNC в оконном приложении D3D?

Я inited D3D со следующими параметрами:

windowed: true; 
backbufferformat: D3DFMT_X8R8G8B8; 
presentinterval: D3DPRESENT_INTERVAL_ONE; 
swapeffect: DISCARD 

Каждый раз, когда вызывается OnPaint, я сделать изображение на BackBuffer и представить его фронт.

Насколько я знаю (и так говорит MSDN), как только я установил D3DPRESENT_INTERVAL_ONE, vsync будет работать.

Но в этом случае изображение раздирается при перетаскивании по горизонтали.

(кажется, что есть линия по изображению, изображение ниже линии показывает на мониторе и выше часть ниже.)

Некоторые сайты говорят D3DPRESENT_INTERVAL_ONE не будет работать в оконных приложениях.

Как я могу включить vsync?

p.s. Я наконец нашел, что D3D vsync включен, в то время как некоторые настройки окна неправильны, что, возможно, само окно не синхронизируется. хотя, я не заглядываю настройки.

+0

Вы попробовали swapeffect: FLIP? – Goz

+0

Я пробовал, как вам было предложено, но это не сработало. –

+0

TBH. Я всегда понимал, что вы не можете VSync для оконного рендеринга. Возможно, я ошибаюсь, но с этим допущением я никогда не был разочарован;) – Goz

ответ

0

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

0

Оконные исторически не могли быть отслежены для d3d, и только недавно это было возможно, когда aero включено в WinVista или Win7, и приложение не работает в режиме презентации.

0

не точно D3D, но AntiTearing.html описывает, как MPC-HC использует оконные EVR и др., Чтобы избежать разрыва окна. Ссылки здесь: http://betterlogic.com/roger/2012/05/gdi-vsync-to-avoid-tearing/ могут быть полезны и для синхронизации (хотя и с чем-то вроде работы).

+0

Ссылка MPC-HC сломана, вот последняя архивная: https://web.archive.org/web/20120505154244/http://mpc-hc.sourceforge.net/AntiTearing.html BTW, я не см. там описание. – tsul

0

Как часто вы называете :: OnPaint? Причина, по которой я спрашиваю, заключается в том, что вы должны чаще называть :: OnPaint, чем частоту обновления вашего подключенного монитора.

Для меня я решил проблему обновления, запустив :: OnPaint всякий раз, когда цикл сообщения простаивает с отменой действия окна. Что произойдет, если вы это сделаете, то команда RenderPresent для D3D будет WAIT, пока графическая карта не закончит рендеринг, что дает вам очень точное время :: OnPaint в синхронизации с фактической частотой обновления монитора!

У меня с этим хорошие успехи, и высказывания выше этого оконного режима не могут vsync определенно недействительны. Даже в DirectX 9 Win XP это работает.

О, и не более того, если у вас несколько подключенных дисплеев, убедитесь, что vsync с фактическим дисплеем, который представляет ваше окно. Это кажется немного более сложным.

3

Я предполагаю, что вы используете D3D9? Следует добавить этот тег. На вашей D3DPRESENT_PARAMS переменной:

Если вы сделали это, и вы используете старый GDI вещи, это не ваша установка, что VSync неправильно, но настройки окна. Вы должны включить двойную буферизацию, или вы все равно будете разрывать.