1

我一直致力于将基于 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 会使应用程序爬行)。

4

3 回答 3

1

WPF 确实使用了硬件加速,但效率非常低 - 它对所有内容进行了太多的绘制调用。它的 3D 渲染功能旨在增强用户界面,而不是繁重的渲染(例如绘制数以万计的单个元素)。有可能您的代码可以优化,但肯定远不及 XNA 为您提供的性能水平。

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

于 2012-05-30T20:27:27.817 回答
0

我已经下载了你的样本,它对我来说很好,没有重大的性能滞后。但是,如果我监视我的性能,无论何时移动鼠标,您执行的任何计算似乎都会遇到某种瓶颈。请参阅随附的屏幕截图,该屏幕显示了大量移动鼠标(图像的左半部分)和不经常移动鼠标(右半部分)时的 CPU 使用情况。

CPU使用率

我认为渲染不是减慢速度的原因,而是事件处理程序中的其他代码。为了确定,我设置RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;了 ,它在我的机器上的行为方式完全相同(良好的 CPU,中等的 GPU)。我也检查了这个 Memleak 问题,但就这一点而言,它看起来还可以——在我的 64 位窗口上,内存使用量永远不会超过 64Megs,垃圾收集有时会有效地释放资源。

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

于 2012-05-29T06:38:53.950 回答
0

似乎单独使用 WPF,目前不可能接近 XNA 的性能。然而,在查看了关于 XNA 集成的 Nick Gravelyns帖子后,我决定使用那里列出的方法,因为我正在开发的应用程序的性能是可以接受的。经过对示例的一些修改和随后的压力测试,我设法使其足够稳定以用于生产代码。我强烈建议任何对 XNA->WPF 集成感兴趣的人看看那篇文章。

于 2012-05-31T20:20:45.720 回答