4

私はWPF機能にSharpDX.WPFプロジェクトを使用しています.SharpDXに付属のツールキット(同じ問題があります!)と比較して、オーバーヘッドの低いライブラリを理解しやすいようです。

最初: 次を使用して、最新の SharpDX の SharpDX.WPF プロジェクトを修正しました: https://stackoverflow.com/a/19791534/442833

次に、ここでも行われたソリューションである DXElement.cs に次のハッキーな調整を行いました。

private Query queryForCompletion;
    public void Render()
    {
        if (Renderer == null || IsInDesignMode)
            return;

        var test = Renderer as D3D11;
        if (queryForCompletion == null)
        {

            queryForCompletion = new Query(test.Device,
                new QueryDescription {Type = QueryType.Event, Flags = QueryFlags.None});
        }

        Renderer.Render(GetDrawEventArgs());

        Surface.Lock();
        test.Device.ImmediateContext.End(queryForCompletion);
        // wait until drawing completes
        Bool completed;
        var counter = 0;
        while (!(test.Device.ImmediateContext.GetData(queryForCompletion, out completed)
                 && completed))
        {
            Console.WriteLine("Yielding..." + ++counter);
            Thread.Yield();
        }
        //Surface.Invalidate();
        Surface.AddDirtyRect(new Int32Rect(0, 0, Surface.PixelWidth, Surface.PixelHeight));
        Surface.Unlock();
    }

次に、立方体パターンで 8000 個の立方体をレンダリングします...

降伏中...

コンソールに頻繁に出力されますが、ちらつきはまだあります。WPF は、レンダリングが完了する前に別のスレッドを使用して画像を表示するのに十分であると想定していますが、確かではありません... SharpDX で WPF サポートの Toolkit バリアントを使用する場合にも、同じ問題が発生します。

問題を示す画像:

注: これらの古いイメージをランダムに、ランダムに切り替えます。また、非常に古いハードウェアを使用しているため、ちらつきがより目立ちます (GeForce Quadro FX 1700)。

この問題を解決するために使用しているものとまったく同じソースコードを含むレポを作成しました: https://github.com/ManIkWeet/FlickeringIssue/

4

3 に答える 3

1

うまくロックできていないと思います。MSDN のドキュメントを理解している限り、レンダリングの最後だけでなく、レンダリング全体でロックする必要があります。

D3DImage がロックされている間、アプリケーションはバック バッファーに割り当てられた Direct3D サーフェスにもレンダリングできます。

D3DImage/SharpDX についてネット上で見つけた情報は、SharpDX の担当者が D3DImage の実​​装方法をあまり好まないため (彼らを責めることはできません)、多少混乱しています。そのため、これは Microsoft 側の「バグ」であるという声明があります。実際にはAPIの不適切な使用の場合。

はい、レンダリング中のロックにはパフォーマンスの問題がありますが、WPF を DirectX11 に移植し、UWP アプリで利用できるSwapChainPanelのようなものを実装しない限り、おそらく修正することはできません。(WPF 自体は引き続き DirectX9 上で動作します)

ロックがパフォーマンスの問題である場合、私が考えた (ただしテストしたことはない) アイデアの 1 つは、オフスクリーン サーフェスにレンダリングし、そのサーフェスを D3DImage にコピーするまでのロック期間を短縮できるというものです。それがパフォーマンスの面で役立つかどうかはわかりませんが、試してみる価値があります。

于 2016-09-18T09:34:53.047 に答える