2011-09-12 25 views
1

前几天我提出以下问题: 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。

谢谢!

+0

根据微软的例子使用Image.Freeze()并没有什么帮助。 –

+0

也许这个虚拟化的画布可以提供帮助吗? http://blogs.msdn.com/b/jgoldb/archive/2008/03/08/performant-virtualized-wpf-canvas.aspx –

回答

0

我最终使用WPF作为接口,并使用SlimDX/XNA进行实际渲染。从它出来的图书馆将在一段时间后提供。

相关问题