作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 SharpDX.WPF 项目用于 WPF 功能,与 SharpDX 附带的工具包相比,它似乎是一个易于理解的低开销库(具有相同的问题!)
首先:我使用以下方法为最新的 SharpDX 修复了 SharpDX.WPF 项目:https://stackoverflow.com/a/19791534/442833
然后我对 DXElement.cs 进行了以下 hacky 调整,解决方案也做了 here :
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();
}
Yielding...
最佳答案
相关 D3DImage
锁定,注意 D3DImage.TryLock
API 具有大多数开发人员不会想到的非常规语义:
Beware!
You must call Unlock even in the case where TryLock indicates failure (i.e., returns false)
D3DImage
时遇到的大部分挫败感的原因。好好工作。
void WPF_D3D_render(IntPtr pSurface)
{
if (TryLock(new Duration(default(TimeSpan))))
{
SetBackBuffer(D3DResourceType.IDirect3DSurface9, pSurface);
AddDirtyRect(new Int32Rect(0, 0, PixelWidth, PixelHeight));
}
Unlock(); // <--- !
}
D3DImage.TryLock(0)
泄漏一个内部 D3D 缓冲区锁 每次它返回失败。您不必相信我的话,这是来自
PresentationCore.dll
的 CLR 代码v4.0.30319:
private bool LockImpl(Duration timeout)
{
bool flag = false;
if (_lockCount == uint.MaxValue)
throw new InvalidOperationException();
if (_lockCount == 0)
{
if (timeout == Duration.Forever)
flag = _canWriteEvent.WaitOne();
else
flag = _canWriteEvent.WaitOne(timeout.TimeSpan, false);
UnsubscribeFromCommittingBatch();
}
_lockCount++;
return flag;
}
_lockCount
无论函数返回成功还是失败,字段都会递增。您必须调用
Unlock()
你自己,如上面的第一个代码示例所示,如果你想避免某些死锁。如果不这样做,调试起来也很麻烦,因为组件在下一次渲染之前不会(可能)死锁,到那时相关的证据早就不复存在了。
Unlock()
如果通话成功,要么。
关于wpf - D3DImage 和 SharpDX 在慢速硬件上闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27358128/
我是一名优秀的程序员,十分优秀!