2009-09-29 53 views
13

我目前正在開發一個可視化工具,吸引了WPF的形​​狀,如路徑,橢圓形等,在畫布上。我已經實施了一種虛擬化方法,在這種方法中,Shapes根據其可見性正在銷燬和創建。但是,即使只有600個橢圓可見,應用程序似乎也很困難。WPF性能:顯示數千路徑/形狀的在Canvas

我的選擇是什麼來加快速度?我正在考慮將分組的Shapes(假設每次500個)呈現爲透明位圖,並且只將它們繪製在Canvas上。但我不知道這是否是一個好主意......從我所收集這需要某種形式的黑客攻擊,如果應用的轉換:關於使用大WritableBitmap

 VisualBrush shapeBrush = new VisualBrush(shape); 

    DrawingVisual drawingVisual = new DrawingVisual(); 
    DrawingContext drawingContext = drawingVisual.RenderOpen(); 

    using (drawingContext) 
    { 
     drawingContext.DrawRectangle(shapeBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 
    } 
    renderTarget.Render(drawingVisual); 

什麼?這是另一種方法嗎?

回答

6

WPF在幕後工作的圖紙和幾何形狀 - 當你說你和形狀的工作,是這些實際的UI元素?這些元素比較重。如果您只使用基本(最好是流式)幾何圖紙繪製圖畫,則根據我的經驗,您將獲得最佳性能。

我設法達到約10000點用這種方法一個合理的幀率,但比任何一個點更復雜的啓動速度變慢(比方說,圓點甚至只是矩形)。不過,如果您想避免儘可能多的WPF開銷,基本的幾何圖形和基本的圖紙是最好的選擇。

可寫的位圖顯然是最終速度更快,但是這意味着你自己都撕掉那些形狀,或緩存結果的位圖,如果它大多是靜態的。此外,您通常會在渲染位圖之前應用轉換,而不是將它們應用於渲染的位圖本身。

+0

我目前正在使用這種方法:一個VirtualPath類,存儲路徑數據並返回一個WPF System.Windows.Shapes.Path一旦其邊界可見。 – kitsune 2009-09-29 08:09:00

+0

感謝您指點我StreamGeometry,我還不知道這個類 – kitsune 2009-09-29 08:09:53

+1

@kitsune,你有沒有完成你的「虛擬路徑,儘快返回路徑可見」的伎倆?我想我可以從我的一個項目中受益 – 2012-02-13 17:43:45

-1

蠻力方法可能實現一個ActiveX控件和渲染直接使用Win32圖形。但是,這將會有些尷尬。 QT的畫布控制可能是一個更溫暖蓬鬆的方法來達到同樣的目的,而且它很快就會呈現這種類型的東西。 Troll爲商業版本的QT提供了一個ActiveX包裝器,因此它可能更易於集成。

+1

這與標記爲「WPF」的問題有什麼關係? – stakx 2014-12-11 22:07:21

2

我知道這是一個老問題,我只是回答社區的利益。

我研究的話題了一下,我發現最好的是像你說的手動創建DrawingVisuals。它爲WPF節省了大量內部工作,因此速度更快。我使用這種技術來創建一個可以有幾百個點的輕量級圖表。這裏是我自己啓發的文章,你可能已經知道了。

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/02/how-to-high-performance-graphics-in-wpf.aspx

編輯:新URL http://khason.net/blog/how-to-high-performance-graphics-in-wpf/
編輯:較新的URL:http://dedjo.blogspot.com/2008/03/how-to-high-performance-graphics-in-wpf.html

好運。