【问题标题】:Drawing huge amount of 2D data on .NET在 .NET 上绘制大量二维数据
【发布时间】:2012-06-09 10:52:18
【问题描述】:

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

【问题讨论】:

  • 更多细节会有所帮助。你的 10k 基元有多大?什么屏幕分辨率?它们重叠吗?它们是否总是可见的(或隐藏在其他下面?)
  • 我在picturebox 中绘制了带有 >10000 条观察值的移动图,即使使用鼠标事件突出显示单击的特定线条,它也能完美工作。你在picturebox上试过了吗?
  • 已编辑问题提供更多详细信息。
  • 如果你保持图形对象的层次顺序并且你在某些点有位图图像(低于 20k 基元),那么你可以加载位图(如果内存是问题,甚至将它保存在文件中)并在此之上执行图形事件以减少绘制图形未更改部分的时间 - 只是一个建议。

标签: .net graphics visualization


【解决方案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)并且没有任何抱怨。

【讨论】:

  • 我不知道我会说 XNA 不“本机”支持包含在 WinForms 或 WPF 中 - 我已经制作了几个自定义的基于 XNA 的组件,我将它们放入一个 winforms 应用程序像任何其他人一样。没有什么棘手的问题——在我的例子中,组件继承了 Panel 并充满了 XNA 视口。
  • @J... 我已经完成了,但需要一些工作。数量不多,但我不想误以为它只是拖放。
  • 有趣...会看看并尝试这种方法。如果着色器效果绘制的对象支持用户输入(即鼠标事件),唯一让我感到困扰的事情。
  • @Jaded 您必须单独处理。不过,您可以使用很多技巧。我们说的是线条图还是填充形状?
【解决方案2】:

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

您可以使用 GDI+ 来绘制位图对象,并且可以在它发生变化时重新绘制它的任意部分。

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

【讨论】:

  • 将考虑作为备份解决方案。应用程序的平台主要是Windows 7,所以WinForms在那里会很丑。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2013-10-04
  • 2018-09-04
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多