2012-03-27 99 views
2

您好我已经设法通过使用D3DImage和共享纹理将SlimDX和DirectX 11图形集成到WPF应用程序中。但是,在高分辨率(2560x1440)下渲染简单场景(例如SlimDX示例中的GameOfLife)时,我的性能会很差。WPF和SlimDX(DirectX 11)互操作

我试着做我的渲染方法的一些性能分析,它看起来像大部分的时间都是在无效backbuffer时锁定D3DImage。

_d3dImage.Lock(); // <- this call takes 78,5 % of the time when rendering the frame 
_d3dImage.AddDirtyRect(new Int32Rect(0, 0, _d3dImage.PixelWidth, _d3dImage.PixelHeight)); 
_d3dImage.Unlock(); 

大量的时间都花在绘画后flusing设备:

_device.ImmediateContext.Flush(); // <- 20,6% of the time when rendering the frame 

任何人都知道的问题,以及如何优化呢?在集成WPF和SlimDX时,你能期望获得下降性能吗?

+1

锁定线程,直到UI线程停止读取后台缓冲区,并且冲洗非常昂贵,因此这些结果并不少见。你的实际表现数字是多少?您的GPU是否支持计算着色器?如果没有,那么这将在软件中运行(即以嗅觉速度)。 – 2012-03-29 03:24:32

+0

看起来问题可能与GameOfLife示例中使用的计算着色器有关。如果我禁用它的帧速率回到60fps ... – Pking 2012-03-29 11:24:21

回答

1

由于你看到锁定和刷新调用(这是GPU需要与CPU同步的点)的性能问题,我猜你的程序严格受GPU限制,并且CPU必须继续拖延等待它赶上。当禁用计算着色器时,性能增加也会产生这种情况。

我不知道在这一点上告诉你什么,除非如果这种猜测是正确的,它会显示你的卡不能处理负载。

+0

谢谢,它会出现这样。尽管我使用的Radeon HD5850应该能够处理负载,但我想 - 着色器并不那么复杂。 – Pking 2012-03-30 06:28:28

+1

这绝对不是全部。我也遇到了同样的问题,Lock()会永久占用,而在Windows Forms中托管DirectX会带来更好的性能。 – 2012-09-08 00:35:10

+0

这很有趣。也许WPF + Dx不是本意的。 – Pking 2012-09-10 15:59:08