私は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/