我正在创建一个 WPF 映射程序,该程序可能会同时加载数百个文件并将其绘制到屏幕上,并且用户可能想要缩放和平移此显示。其中一些文件类型可能包含数千个点,这些点很可能作为某种路径连接。其他支持的格式包括 TIFF 文件。
使用一个绘制所有数据的 DrawingVisual 是否会提高性能,还是应该为加载的每个文件创建一个新的 DrawingVisual?
如果有人能就此提供任何建议,我们将不胜感激。
您会在 Stack Overflow 上找到很多相关问题,但并非所有问题都提到将大量数据绘制到屏幕上的最高性能方法之一是使用可写位图 http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspxAPI。我建议看一下可写位图Ex https://github.com/teichgraf/WriteableBitmapEx/Codeplex 上的开源项目。披露,我曾经对此做出过贡献,但这不是我的图书馆.
尝试过 DrawingVisual、StreamGeometry、OnRender、Canvas 后,一旦您必须在屏幕上绘制 1,000 多个或更多“对象”,所有这些都会失败。有一些技术可以处理画布的虚拟化(有百万项目演示 http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx使用虚拟化画布),但即使如此,在速度减慢之前,一次可见的数量也仅限于约 1000 个。 WriteableBitmap 允许您直接访问位图并在其上绘图(oldskool 风格),这意味着您可以快速绘制数以万计的对象。您可以自由地实现自己的优化(多线程、详细程度),但请注意您不会使用该 API 获得太多装饰。你实际上是在自己做这项工作。
但有一点需要注意。 WPF 使用 CPU 进行曲面细分/GPU 进行渲染,而 WriteableBitmap 将使用 CPU 来处理所有事情。因此,填充率(每帧渲染的像素数)成为瓶颈,具体取决于您的 CPU 能力。
如果您确实需要高性能渲染,我建议您看看SharpDX http://sharpdx.org/(托管 DirectX)以及与 WPF 的互操作。这将为您提供最高的性能,因为它将直接使用 GPU。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)