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



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

一个词:着色器。

这看起来像是在 WPF 中使用着色器的不错教程。像素和顶点着色器本身对于绘制基元非常简单。

着色器可让您充分利用硬件加速。在一个体面的 GPU 上,10k 基元算不了什么。

在这种情况下,逐帧更改颜色等是微不足道的。

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

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

更新 10/2012

XNA 实际上已经死了,但是在 WPF 中使用着色器的例子很多。如果你的C++技能达到要求,则可以使用 D3DImage 类在 WPF 窗体上放置 Direct3D 窗口。XNA 示例对于其着色器内容和图形开发的高级方法仍然很有价值。

如果你对XNA感到兴奋,看看MonoGame,它的发展很好。我成功地将它用于一些跨平台的3D东西(Win7,OSX,iOS),并且没有任何抱怨。

如果需要详细控制绘制方式和重绘区域,请使用 GDI+(由 WinForms 使用)。

可以使用 GDI+ 绘制到位图对象中,并且可以在位图对象发生更改时重绘其任意部分。

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

相关内容

  • 没有找到相关文章