前幾天我提出以下問題: 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 –