2

了解しました。正常に機能しているように見えるカスタムVMR9アロケータ/プレゼンターを作成しました。ただし、ビデオフレームをアロケータ/プレゼンターサーフェスからアプリケーションサーフェスにコピーしようとすると、ビデオがちらつくように見えます。オーディオの再生は問題ないので、マシンがダウンしているなどの問題ではないと確信しています。これは、レンダリングループにあるコードです。

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();
}

このちらつきは消えます。これはどういうわけか悪い形/ハックであり、それが解決するよりも多くの問題を引き起こす可能性があるのではないかと心配しています。この分野での経験はありますか?より良い解決策はありますか?

ありがとう!

4

3 に答える 3

3

ビューポート全体をフレームごとに再描画する場合は、クリアする理由はなく、実際にパフォーマンスが大幅に向上する可能性があるので、ぜひお試しください。あなたのちらつきに関しては、それは何か違うかもしれません。WM_PAINTメッセージで描画していますか?その場合は、WM_ERASEBKGNDメッセージもインターセプトし、メッセージを受け取ったら1を返すことをお勧めします。これにより、ウィンドウが背景を消去しようとするのを防ぎ、過去のちらつきを取り除くことができました。

参考までに:DoomやQuakeでノクリップチートをしたことがありますか?壁の外を歩くと、すべてが「トレイル」を残し始めますか?これは、通常の状況ではシーン全体がとにかく毎回再描画されるため、バックバッファをクリアしていないためです。私はそれがidにとって十分であるならそれは私にとって十分であると言います!:)

編集:ああ、そしてもっと多くのことについて!必要かどうかはわかりませんが、BeginScene()を呼び出した後は常にクリアします。ちらつきの原因にもなっている可能性があります。

于 2009-09-20T04:39:08.267 に答える
0

TBHは、データをテクスチャに直接コピーする独自のdirectshowレンダリングフィルターを作成してから、テクスチャを使用して画面上に四角形を描画するのが最善だと思います。パフォーマンスが大幅に向上します。レンダリングフィルターの作成は実際には非常に簡単です。特に、オペレーティングシステムに公開する必要がないことを理解している場合は、DirectShowの難しいハードルのほとんどをジャンプする必要はありません。

編集:MicrosoftのDirectShowヘルパーコードの一部として提供されている「ダンプフィルター」を調べてください...

于 2009-09-20T08:19:53.217 に答える
0

私も同じ問題に直面しました。私の場合、ちらつきの理由は、BeginScene/EndSceneペア内のStretchRect呼び出しにありました。

于 2015-09-23T13:36:30.660 に答える