需要使用 .NET 框架来可视化大量 2d 图形对象(绘制一些复杂结构的模式) - 例如在一个画布上 10-20000 个图元。假设我们有各自的硬件 - 具有多核 CPU、大量 RAM 和一些最新显卡的强大服务器 PC。根据书籍和 MSDN,解决方案是使用 WPF 及其硬件加速,特别是绘图子系统。我已经用 GeometryDrawings 和 VisualHost 实现了简单的场景,它相当不错,但有一个问题 - 可视化对象还需要具有不断变化的状态(即快速更改颜色而不重绘)并接受鼠标事件(单击、拖放) Freezables 不支持,因为它们不是框架元素。任何想法如何最有效地解决问题?我们的图形对象看起来非常像框架提供的 Shape 及其后代,但它肯定不符合性能要求。
* 编辑 *
图形对象可以具有简单的结构(红色矩形)和复杂的(包含路径的多个嵌套对象 - 随机形状的曲线)。对象可能重叠。分层(在某个特定时刻隐藏和显示特定对象)可以稍后作为附加功能实现。状态变化可能每 2-5 秒发生一次,由外部事件触发。
2 回答
一个词:着色器。
这看起来像是在 WPF 中使用着色器的不错的教程。像素和顶点着色器本身对于绘制图元非常简单。
着色器将让您充分利用硬件加速。在一个不错的 GPU 上,10k 个基元算不了什么。
在这种情况下,逐帧更改颜色等是微不足道的。
大多数着色器教程都是针对 3D 的,但它们也适用于 2D。
你也可以看看 XNA。它本身不支持在 WPF 或 Winforms 窗口内放置 DirectX 上下文,但也有相当多的教程。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+ 不是硬件加速的,所以我会做一个快速的基准测试。我的感觉是在你的情况下它会更快。