DirectX мерцающее видео - PullRequest
       16

DirectX мерцающее видео

2 голосов
/ 20 сентября 2009

Хорошо, поэтому я написал собственный VMR9 Allocator / Presenter, который, кажется, работает нормально. Однако, когда я пытаюсь скопировать видеокадры с поверхностей Allocator / Presenter на поверхности моего приложения, видео начинает мерцать. Воспроизведение звука в порядке, поэтому я уверен, что проблема не в том, что машина зависла или что-то в этом роде. Это код, который у меня есть в моем цикле рендеринга.

g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0);

// render the scene
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//g_pd3dDevice->SetRenderTarget(0, g_pd3dSurface);

g_pd3dDevice->StretchRect(vmr9_ap->renderSurface, src, g_pd3dSurface, dest, D3DTEXF_NONE);

    // end the scene
    g_pd3dDevice->EndScene();
}

Однако, если я изменю это на это (комментируя очистку буфера)

// g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0);

// render the scene
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//g_pd3dDevice->SetRenderTarget(0, g_pd3dSurface);

g_pd3dDevice->StretchRect(vmr9_ap->renderSurface, src, g_pd3dSurface, dest, D3DTEXF_NONE);

    // end the scene
    g_pd3dDevice->EndScene();
}

это мерцание исчезает. Я беспокоюсь, что это как-то нехорошо / хакерски и может вызвать больше проблем, чем решить. У кого-нибудь есть опыт в этой области? Есть ли лучшее решение?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 20 сентября 2009

Если вы намереваетесь перерисовывать весь видовой экран каждый кадр, нет смысла делать очистку, и это действительно может привести к значительному увеличению производительности, так что дерзайте! Что касается вашего мерцания, это может быть что-то другое. Вы делаете вы рисуете в сообщении WM_PAINT? Если это так, вы можете также перехватить сообщение WM_ERASEBKGND и просто вернуть 1, когда получите его. Это препятствует тому, чтобы окна пытались стереть фон, и помогло мне избавиться от некоторых мерцаний в прошлом.

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

Редактировать: О, и еще что! Я не уверен, требуется ли это или нет, но я всегда делаю ясное ПОСЛЕ вызова BeginScene (). Может также способствовать вашему мерцанию.

0 голосов
/ 23 сентября 2015

Я столкнулся с той же проблемой. В моем случае причина мерцания была в вызове StretchRect внутри пары BeginScene / EndScene.

0 голосов
/ 20 сентября 2009

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

Редактировать: найдите «Фильтр дампа», который входит в состав вспомогательного кода Microsoft DirectShow ...

...