我正在使用 SharpDX.WPF 项目来实现 WPF 功能,与 SharpDX 附带的工具包相比,它似乎是一个易于理解的低开销库(它有同样的问题!)
首先:我使用以下方法修复了最新 SharpDX 的 SharpDX.WPF 项目:https ://stackoverflow.com/a/19791534/442833
然后我对 DXElement.cs 进行了以下 hacky 调整,这里也完成了一个解决方案:
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)
A 做了一个回购,其中包含与我用来解决此问题的完全相同的源代码: https ://github.com/ManIkWeet/FlickeringIssue/