Как использовать WaitForVBlank для получения прерываний VSYNC в Direct3d9 - PullRequest
2 голосов
/ 05 октября 2011

Я новичок в Direct3D9 и пробую кое-что.Я хочу использовать WaitForVSync на устройстве IDirect3DDevice9Ex.Тем не менее, я понятия не имею, как его использовать и получать прерывания VSYNC.Я не мог найти много помощи на MSDN, ни какой-либо фрагмент кода.Любая помощь будет оценена.

Спасибо, Моц

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Этот код позволит вам вызывать функцию (для выполнения вашего прерывания) в течение периода вертикального пробела. Я бы не рекомендовал это из-за проблем со временем. К тому времени, когда вы выясните, что вы находитесь в вертикальном пустом периоде, это может закончиться. Вы можете попытаться учесть это, если знаете ваше целевое оборудование, но вам придется рассчитать задержку вызова функции экспериментально. Я рекомендую не использовать обратный вызов VSYNC. Вот код, чтобы сделать это в любом случае.

D3DRASTER_STATUS rStatus;  
pd3dDevice->GetRasterStatus(0, &rStatus);

while (rStatus.InVBlank)
{
  Sleep(0); // Ensure other threads get CPU time.
  pd3dDevice->GetRasterStatus(0, &rStatus);
}

// Should be in a vertical blank period. Call your function here.
MyFunction();
0 голосов
/ 14 октября 2011

1) если вы хотите, чтобы ваше отображение отображалось только при возникновении vsync, используйте D3DPRESENT_INTERVAL_DEFAULT или D3DPRESENT_INTERVAL_ONE.

2), если вы хотите выполнить некоторую обработку, пока Present () ожидает vsync, вы можете использовать флаг D3DPRESENT_DONOTWAIT с IDirect3DSwapChain9 :: Present, он вернет D3DERR_WASSTILLDRAWING, если презентация (и vsync) еще не состоялась.Вы можете вызвать IDirect3DDevice9 :: GetSwapChain, чтобы получить цепочку обмена по умолчанию.

3) Вы также можете использовать IDirect3DDevice9 :: GetRasterStatus, чтобы определить, находится ли растр (строка сканирования) в области вертикальной синхронизации.Для этого требуется поддержка драйверов и аппаратного обеспечения, вы можете определить, поддерживает ли это ваш компьютер, проверив D3DCAPS9.Caps на наличие D3DCAPS_READ_SCANLINE.Все современное графическое оборудование, о котором я знаю, имеет такой предел, но оно также может зависеть от возраста / типа используемого монитора / телевизора.

Извлечено из: http://www.gamedev.net/topic/319407-wait-for-vsync/

...