如何在WPF中在Canvas上正确绘制GeometryDrawing(性能方面)

时间:2011-09-12 22:29:45

标签: c# wpf performance graphics graph

前几天我问过以下问题: How to draw graphics as efficiently as possible in WPF

大家一致认为,使用Canvas作为主机对象与GeometryDrawing类相结合,我没有什么可担心性能的。

虽然在实施一个简单的测试后,我得出的结论是,应用程序仅在屏幕上的3000个对象上窒息。

在实现过程中,我注意到在将Canvas渲染之前我必须将GeometryDrawing对象封装在2个不同的对象(DrawingImage和Image)中,我认为这是阻塞点所在的位置。下面是我目前如何执行此操作的示例代码:

//Node
GeometryDrawing geoNode = new GeometryDrawing(
    new SolidColorBrush(Utils.IntToColor(graphNode.Color)), 
    new Pen(Brushes.Black, graphNode.Thickness), 
    new EllipseGeometry(new Point(graphNode.Position.X, graphNode.Position.Y), 16, 16)
);

Image imageNode = new Image
{
    Source = new DrawingImage(geoNode),
};

SetLeft(imageNode, graphNode.Position.X);
SetTop(imageNode, graphNode.Position.Y);

Children.Add(imageNode);

我的问题是:

  • 是否正确封装GeometryDrawing对象以获取它们?

  • 是否有更快的方式来显示我的GeometryDrawing对象而不必封装它们(例如Canvas以外的东西)?

  • 如果我希望使用WPF的3000个屏幕对象获得良好的性能,我是否期望太多?它对我来说似乎不是一个高数字,因为一个合适的2D引擎可以渲染10000个对象并且仍能顺利运行。此外,有人指出,“引擎盖下”WPF使用DirectX。

谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用WPF作为界面,并使用SlimDX / XNA进行实际渲染。从它出来的库将在一段时间后可用。