我正在创建一个WPF映射程序,它可能会在任何时候加载并绘制数百个文件到屏幕上,并且用户可能希望缩放和平移此显示。其中一些文件类型可能包含数千个点,这些点很可能作为某种路径连接起来。其他支持的格式包括TIFF文件。
它是更好的性能有一个单一的DrawingVisual到所有的数据绘制,或者我应该创建一个新的DrawingVisual为每个文件加载?
如果有人能提供任何建议,我将不胜感激
你会在Stack Overflow上发现很多相关的问题,但是并不是所有的问题都提到将大量数据绘制到屏幕上的最高效的方法之一是使用WriteableBitmap API。我建议看看codeplex上的WriteableBitmapEx开源项目。披露,我曾经为这个做过贡献,但它不是我的库。
在尝试过DrawingVisual, StreamGeometry, OnRender, Canvas后,一旦你必须绘制1000多个"对象",所有这些都将失效。对着屏幕。有一些技术可以处理画布的虚拟化(虚拟化画布有一百万个项目的演示),但即使这样,在减速之前,一次也只能看到1000个项目。WriteableBitmap允许您直接访问位图并在其上绘制(oldskool风格),这意味着您可以快速绘制数万个对象。你可以自由地实现你自己的优化(多线程,细节级别),但要注意,你没有得到太多的装饰与API。你实际上是在自己做这项工作。不过有一个警告。当WPF使用CPU进行镶嵌/GPU进行渲染时,WriteableBitmap将使用CPU处理所有事情。因此,填充率(每帧渲染的像素数)成为瓶颈,这取决于您的CPU功率。
如果你真的需要高性能渲染,我建议你看看SharpDX (Managed DirectX)和与WPF的互操作。这将给你最高的性能,因为它将直接使用GPU。
在我的经验中,使用许多小的DrawingVisuals每次渲染的细节很少,与每次渲染的细节较少的DrawingVisuals相比,性能更好。我还发现,删除所有的视觉效果并渲染新的视觉效果比在需要重绘时重用现有的视觉效果要快得多。将每个地图分解成许多视觉效果可能有助于性能。
对于任何与性能相关的事情,使用您自己的场景进行计时测试是确保的最佳方法。