使用WPF Visual层的高性能图形

我正在创建一个WPF映射程序,它可能会在任何时候将数百个文件加载并绘制到屏幕上,并且用户可能想要缩放和平移此显示。 其中一些文件类型可能包含数千个点,这些点很可能作为某种路径连接。 其他支持的格式将包括TIFF文件。

具有绘制所有数据的单个DrawingVisual是否更好,或者我应该为每个加载的文件创建一个新的DrawingVisual?

如果有人可以就此提出任何建议,我将不胜感激。

你会发现很多关于Stack Overflow的相关问题,但是并非所有人都提到在屏幕上绘制大量数据的最高性能方法之一就是使用WriteableBitmap API。 我建议看一下codeplex上的WriteableBitmapEx开源项目。 披露,我曾经为此做过一次贡献,但这不是我的图书馆

经过DrawingVisual,StreamGeometry,OnRender,Canvas的实验,一旦你必须在屏幕上绘制1,000多个或更多“对象”,所有这些都会失败。 有一些技术可以处理canvas的虚拟化(有一百万个项目使用虚拟化canvas进行演示 ),但即使这样也仅限于在减速之前一次可见的~1000。 WriteableBitmap允许您直接访问位图并使用它(oldskool样式),这意味着您可以快速绘制数万个对象。 您可以自由地实现自己的优化(multithreading,详细程度)但请注意,您不会使用该API获得多少装饰。 你真的在做自己的工作。

但有一点需要注意。 虽然WPF使用CPU进行tesselation / GPU渲染,但WriteableBitmap将使用CPU来处理所有事情。 因此,填充率(每帧渲染的像素数)将成为瓶颈,具体取决于您的CPU功率。

如果你真的需要高性能渲染,那么我建议不要看看SharpDX (Managed DirectX)和WPF的互操作。 这将为您提供最高性能,因为它将直接使用GPU。

最好的祝福,

使用许多小型DrawingVisuals,每个视觉渲染的细节很少,在我的体验中提供了更好的性能,相比较少的DrawingVisuals,每个视觉渲染的细节更多。 我还发现删除所有视觉效果并渲染新的视觉效果比在需要重绘时重用现有视觉效果更快。 将每个地图分成若干视觉效果可能有助于提高性能。

与任何性能相关,使用您自己的场景进行时序测试是最好的方法。