需要使用.NET框架可视化大量的2d图形对象(绘制一些复杂结构的模式)-例如在一个画布上显示10-20000个图元。假设我们有各自的硬件-功能强大的服务器PC,具有多核CPU,海量RAM和一些最新的显卡。根据书籍和MSDN的说法,解决方案是使用WPF的硬件加速,特别是绘图子系统。我已经用GeometryDrawings和VisualHost实现了一个简单的场景,它相当不错,但有一个问题-可视化的对象还需要有变化的状态(即快速改变颜色而不需要重绘),并接受Freezables不支持的鼠标事件(单击、拖放),因为它们不是框架元素。有什么办法能最有效地解决这个问题吗?我们的图形对象看起来非常像框架提供的形状及其后代,但它肯定不符合性能要求。
*编辑*
图形对象可以具有与复杂(包含路径的多个嵌套对象-随机形状的曲线)一样简单的结构(红色矩形)。对象可能会重叠。分层(在某个特定时刻隐藏和显示特定对象)可以在以后作为附加功能实现。状态变化可能每2-5秒发生一次,由外部事件触发。
发布于 2012-06-05 22:16:49
一个词:着色器。
在WPF中使用着色器的This looks like a decent tutorial。像素和顶点着色器本身对于绘制基元来说是非常简单的。
着色器将使您能够充分利用硬件加速。在一个像样的GPU上,10k的原语不算什么。
在这种情况下,在逐帧的基础上改变颜色等是微不足道的。
大多数着色器教程都适用于3D,但它们也适用于2D。
您还可以看看XNA。它本身并不支持将DirectX上下文放入WPF或Winforms窗口中,但也有相当多的教程介绍了这一点。XNA非常强大,可以处理您需要的大量样板代码,如矩阵操作等。即使您决定不使用XNA,create.msdn.com上的教程也非常有教育意义。
2012年10月更新
XNA实际上已经死了,但是在WPF中有很多使用着色器的例子。如果您的C++技能达到要求,则可以使用D3DImage class在WPF窗体上放置一个Direct3D窗口。XNA示例仍然很有价值,因为它们的着色器内容和图形开发的高级方法。
如果你对XNA感到兴奋,那就看看MonoGame吧,它进展得很好。我正在成功地将它用于一些跨平台的3D东西(Win7、OSX、iOS),并且没有任何抱怨。
发布于 2012-06-05 22:07:12
如果您需要详细控制绘制的方式以及重绘哪些区域,请使用GDI+ (由WinForms使用)。
您可以使用GDI+绘制到位图对象中,并且可以在位图对象发生更改时重新绘制其中的任意部分。
AFAIK GDI+不是硬件加速的,所以我会做一个快速的基准测试。我的感觉是在你的情况下会更快。
https://stackoverflow.com/questions/10897006
复制相似问题