在.NET上绘制大量的2D数据

时间:2012-06-05 12:06:01

标签: .net graphics visualization

需要使用.NET框架可视化大量的2D图形对象(绘制一些复杂结构的模式) - 例如,在一个画布上使用10-20万个基元。假设我们各自的硬件 - 功能强大的服务器PC具有多核CPU,大量的RAM和一些最近的视频卡。根据书籍和MSDN,解决方案是使用WPF及其硬件加速,特别是绘图子系统。我用GeometryDrawings和VisualHost实现了简单的场景,它很不错,但是有一个问题 - 可视化对象也需要改变状态(即快速改变颜色而不重绘)并接受鼠标事件(点击,拖动' )Freezables不支持,因为它们不是框架元素。任何想法如何最有效地解决问题?我们的图形对象看起来非常类似于框架提供的Shape及其后代,但它肯定不符合性能要求。
*编辑*
图形对象可以具有与复杂一样简单的结构(红色矩形)(包含路径的多个嵌套对象 - 随机形状的曲线)。对象可能重叠。分层(在某个特定时刻隐藏和显示特定对象)可以稍后作为附加特征实现。状态变化可能每2-5秒发生一次,由外部事件触发。

2 个答案:

答案 0 :(得分:1)

一个字:着色器。

This looks like a decent tutorial在WPF中使用着色器。对于绘制图元,像素和顶点着色器本身非常简单。

着色器可让您充分利用硬件加速。在一个不错的GPU上,10k原语什么都不是。

在此上下文中,逐帧更改颜色等是微不足道的。

大多数着色器教程都适用于3D,但它们也适用于2D。

你也可以看看XNA。它本身不支持在WPF或Winforms窗口中放置DirectX上下文,但是也有相当多的教程。 XNA非常强大,它可以处理许多样板代码,例如矩阵操作等等。即使您决定不使用XNA,create.msdn.com上的教程也非常有教育意义。

2012年10月更新

XNA实际上已经死了,但是在WPF中有很多使用着色器的例子。如果你的C ++技能达到了吸引力,你可以使用D3DImage class在你的WPF表单上放置一个Direct3D窗口。 XNA样本对于着色器内容和图形开发的高级方法仍然很有价值。

如果您对XNA感到兴奋,请查看MonoGame,这是很好的。我正在成功地使用它来制作一些跨平台的3D东西(Win7,OSX,iOS)并且没有任何抱怨。

答案 1 :(得分:0)

如果您需要详细控制绘图的完成方式以及重绘的区域,请使用GDI +(由WinForms使用)。

您可以使用GDI +绘制到Bitmap对象中,并且可以在更改时重绘它的任意部分。

AFAIK GDI +不是硬件加速的,所以我会做一个快速的基准测试。我觉得你的情况会更快。