gpt4 book ai didi

c# - 需要 SharpDXElement 替代品。 sharpDX WPF 闪烁的解决方法

转载 作者:太空狗 更新时间:2023-10-29 22:36:58 34 4
gpt4 key购买 nike

我有一个即将完成的 SharpDX 项目。它使用 Kinect 进行交互。因此,我的项目将 WPF 用于 Kinect 区域和 KinectUserViewer 对象。到目前为止,SharpDX 在所有方面都表现出色,但是,当它到达大量使用 direct3D 的程序的某个部分时,它开始闪烁。这显然与以下事实有关:D3Dimage(由 MainWindow.xaml 中的 SharpDXElement 使用)可能“根本损坏并且不适合 WPF 中的高效 D3D 渲染”[1] .有没有办法保留我的 WPF 元素而不用 direct3D 闪烁?

最佳答案

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

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

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

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

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

D3DImage.Lock();
Thread.Sleep(2); // 2ms
D3DImage.AddDirtyRect(...);
D3DImage.Unlock();

如果这减少或消除了您的闪烁,这就是您的问题。一个更彻底的解决方案,至少对于 Direct3D 10 或 11,是 use query events as described in this question .

使用 Windows 窗体的问题是您最终会遇到 WPF 空域问题(WPF 项目无法在子窗口上方绘制)。 Airspace issues can be fixed ,但这项工作比编辑 SharpDXElement 复杂得多。

关于c# - 需要 SharpDXElement 替代品。 sharpDX WPF 闪烁的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894051/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com