WPF慢速Tilemap渲染性能

时间:2012-05-29 00:04:34

标签: wpf winforms performance xna tile

我一直在努力将基于XNA / WinForms的现有tilemap编辑器迁移到WPF。我对WPF很新,但大多数概念并不难理解。我有一个嵌入ScrollViewer的Viewbox,使用(Viewbox)派生的OnRender方法提供的DrawingContext中的DrawImage方法绘制地图。问题是,当屏幕上有相当大量的磁贴(在我的机器上大于1000)时,我无法实现与XNA / WinForm版本相同的性能。我已经实现了缩放和平移,但是当我在屏幕上显示大量的图块时,我缩小太远或平移时,存在严重的延迟,这会破坏用户体验。我采取了几个明显的优化措施(冻结源位图,剔除无法看到的磁贴,将位图缩放模式设置为LowQuality,提供缓存缓存提示),但它们似乎无法解决问题。问题显然在于WPF使用DrawingContext处理绘制纹理四边形的方式。

我提供了一个示例应用程序,其中包含重现问题所需的所有代码:SampleGridDrawingExample

按住鼠标中键并移动鼠标进行平移。随着窗口大小的增加,它变得越来越明显(显然是因为渲染了更多的瓷砖)。

在WPF中有比DrawingContext更快的方法来绘制具有合理性能的大量纹理四边形吗?使用XNA / WinForms我可以在多个层中绘制~50000个具有合理延迟的图块,而在WPF中使用我当前的方法超过1000会导致明显的延迟(> 10000会使应用程序爬行)。

3 个答案:

答案 0 :(得分:1)

WPF确实使用硬件加速,但效率非常低 - 它会让所有内容的绘制调用过多。它的3D渲染功能用于增强用户界面,而不是重载渲染(例如绘制数以万计的单个元素)。您的代码可能已经过优化,但肯定无法达到XNA为您提供的性能水平。

更好的选择是在WPF中构建编辑器,但将渲染器保留在XNA中并将其托管在编辑器中。

答案 1 :(得分:0)

我已经下载了您的样本,它对我来说没问题,没有重大的性能滞后。但是,如果我监视我的性能,那么无论何时移动鼠标,您执行的任何计算都会出现某种瓶颈。请参阅随附的屏幕截图,其中说明了大量移动鼠标(图像的左半部分)并且不经常移动鼠标(右半部分)时的CPU使用情况。

CPU usage

我认为渲染不会降低速度,而是事件处理程序中的其他代码。 为了确定,我设置RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;,它在我的机器上的行为完全相同(良好的CPU,适中的GPU)。我也检查过Memleak问题,但就此而言,它看起来还不错 - 在我的64位窗口上,内存使用率从未超过64Megs,垃圾收集有效地不时地释放资源。

您提到以前的解决方案。您的解决方案的哪个部分基于XNA? XNA依赖于硬件加速(默认情况下也是WPF),另一方面,WinForms纯粹是CPU加速。谁运行你的旧魔法,你的CPU或你的GPU?

答案 2 :(得分:0)

似乎单靠WPF,目前无法接近XNA的性能。然而,在看了关于XNA集成的Nick Gravelyns post后,我决定使用那里列出的方法,因为我正在开发的应用程序的性能是可以接受的。在对样本进行一些修改并进行后续压力测试后,我设法使其足够稳定以用于生产代码。我强烈建议任何对XNA-> WPF集成感兴趣的人来看一下该帖子。