需要SharpDXElement替代品.解决方法sharpDX WPF闪烁

Aso*_*sor 5 c# wpf xaml sharpdx d3dimage

我有一个非常接近完成的SharpDX项目.它使用Kinect进行交互.因此,我的项目将WPF用于Kinect区域和KinectUserViewer对象.到目前为止,SharpDX已经为一切工作做得很好,然而,当它到达使用direct3D的程序的某个部分时,它开始闪烁.这显然与D3Dimage(由MainWindow.xaml中的SharpDXElement使用)可能"从根本上被破坏并且不适合WPF中的有效D3D渲染"这一事实有关[1].有没有办法保持我的WPF元素,而不是使用direct3D闪烁?

Nex*_*ine 5

闪烁可能表示GPU在D3DImage尝试将其复制到其前缓冲区之前未完成渲染帧.这很容易在WPF中发生,因为WPF不使用呈现给交换链的标准机制来呈现帧.相反,大多数代码使用如下所示的内容:

// rendering code
Device.Flush(); // or equivalent, depending on Direct3D version used
D3DImage.Lock();
D3DImage.AddDirtyRect(...);
D3DImage.Unlock();
Run Code Online (Sandbox Code Playgroud)

这至少是后面的模式SharpDXElement.InvalidateRender- 我没有看到该Device.Flush()文件,但我怀疑它是在调用代码中.

问题是Device.Flush()不同步.它适用于轻型GPU负载 - GPU在锁定/解锁代码完成之前完成 - 但是对于较重的负载,它通常没有完成渲染,导致至少某些帧的空白帧.这看起来像闪烁.

开源的好处是你可以修改代码.要验证此问题并提供简单(如果是hackish)解决方案,请尝试给GPU更多时间:

D3DImage.Lock();
Thread.Sleep(2); // 2ms
D3DImage.AddDirtyRect(...);
D3DImage.Unlock();
Run Code Online (Sandbox Code Playgroud)

如果这减少或消除了你的闪烁,这是你的问题.更彻底的解决方案,至少对于Direct3D 10或11,是使用此问题中描述的查询事件.

使用Windows窗体的问题在于,您最终会遇到WPF空域问题(WPF项目无法在子窗口上方绘制).空域问题可以修复,但工作比编辑SharpDXElement要复杂得多.