前几天我提出以下问题: How to draw graphics as efficiently as possible in WPF如何正确地在WPF绘制GeometryDrawing在Canvas(性能明智)
的共识是,使用画布作为主机对象结合GeometryDrawing我没有什么可怕的表现。
虽然在实施一个简单的测试后,我得出的结论是应用程序在屏幕上只有3000个对象窒息。在实现过程中,我注意到我必须在两个不同的对象(DrawingImage和Image)中封装一个GeometryDrawing对象,然后才能使Canvas呈现它,我认为这是chokepoint所在的位置。下面是我如何做到这一点目前是示例代码:
//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。
谢谢!
根据微软的例子使用Image.Freeze()并没有什么帮助。 –
也许这个虚拟化的画布可以提供帮助吗? http://blogs.msdn.com/b/jgoldb/archive/2008/03/08/performant-virtualized-wpf-canvas.aspx –