Как включить VSYNC в оконном приложении D3D? - PullRequest
3 голосов
/ 12 октября 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 13 октября 2015

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

if (bVysncEnabled)
{
    presentParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
    presentParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
}
else
{
    presentParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    presentParams.FullScreen_RefreshRateInHz = 0;
}

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

0 голосов
/ 20 июня 2013

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

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

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

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

0 голосов
/ 21 июня 2011

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

0 голосов
/ 09 мая 2012

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

0 голосов
/ 14 января 2011

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

...