2008-09-29 66 views
5

我正在處理的項目需要渲染一個ESRI形狀文件,該文件可以有大量的多邊形/形狀。當我將所有這些多邊形,線條,點等添加到我正在使用的畫布中時,它變得非常慢。如何通過畫布上的大量多邊形提高性能和內存使用率?

要繪製地圖上的形狀,我創建了一個Path對象,並將它的Data屬性設置爲StreamGeometry。我最初使用了Polygon,但根據MSDN,StreamGeometry的重量更輕。

我該如何提高性能?將完成的產品轉換爲位圖或VisualBrush幫助?是否有更高效的方式將所有這些形狀渲染到畫布上?

編輯:我忘了提及,這需要能夠在部分信任XBAP中工作。

回答

0

您即將發現GPU背後的動機和瘋狂的超頻和冷卻顯卡。和雙緩衝。

And:將東西轉換爲位圖:渲染它有什麼不同?

畢竟你有n個對象/某種程度/必須呈現(除非你可以找出哪些對象隱藏在其他對象的後面,但這並沒有多大幫助,因爲你必須看看n!對象關係)。

此外:也許它離開了正統的面向對象方法並轉而使用過程。

0

@xmjx

和:東西轉換爲位圖:有什麼區別渲染呢?這裏

我的想法是,我的放緩可能由具有畫布上對象的n個,與1位造成的。也就是說,我不知道性能,或者將具有n個對象的畫布轉換爲位圖時在後臺發生的情況。

我不希望使用位圖,這樣我可以允許用戶與形狀/多邊形進行交互(修改/刪除)。

1

您可能受限於畫布窗口小部件的性能。如果您可以選擇使用第三方工具包,請參閱QT.它具有高性能canvas widget,可以快速呈現複雜的形狀。這已被用於at least one GIS application,所以它在這個空間有一些記錄。

您可以wrap QT as an ActiveX control或使用Qyoto/Kimono .Net綁定接口到.Net應用程序。 Troll Tech剛剛翻新了他們的網站,我找不到他們曾經在那裏下載的演示版,但它顯示了QGraphicsView小部件可以實時渲染一個非常大的矢量圖並縮小。

+0

謝謝,不知道它是否會爲工作我因爲我需要部署爲XBAP。 – Dylan 2008-09-29 19:41:32

+0

QT還有一個瀏覽器插件工具 - 如果你在開發人員支持區尋找,你應該可以找到它。您可能想要編輯您的原始帖子以闡明XBAP要求。 – ConcernedOfTunbridgeWells 2008-09-29 19:47:06

2

您可以嘗試使用GDI +或直接使用x而不是WPF。

我做了一個類似的項目(通過WPF渲染地圖數據),這是我一年前寫的一篇MSDN雜誌的文章。

這只是我寫得相當快(文章+應用程序花了大約1周)的東西,它只是被設計成「這是你可以做的事情」,所以我沒有專注於性能許多。無論如何,我遇到了同樣的問題。一旦畫布上的多邊形數量變大,渲染性能就開始受到影響。例如,調整窗口大小約需1/2秒左右。

很多這一切都與WPF的開銷有關。它主要被設計成一個GUI工具包,而不是一個高性能的圖形引擎。這意味着它專注於高效渲染的功能豐富性。由於對象數量較少(在大多數GUI應用程序中可能會發現的),性能非常好,數據綁定,動畫和聲明式樣特徵(以及所需的所有事件路由和其他事物)可以真正派上用場。

但是,繪製地圖時,數據的龐大體積可能會導致所有這些整齊的數據綁定功能導致性能問題,正如您所知的那樣。

如果你不需要聲明樣式和動畫,那麼我會消除WPF,並使用GDI +繪製你自己的地圖。它基本上包括設置正確的變換矩陣以使地圖繪製到控制表面上,然後遍歷所有多邊形並調用一堆DrawPolygon方法。

要啓用交互功能,您必須編寫自己的測試代碼,並且在窗體大小調整的任何時候您都必須重新繪製地圖。您還必須手動編寫任何動畫或樣式更改或類似您想要執行的操作(例如鼠標懸停在區域上時突出顯示區域)。但是,編寫該代碼不應該那麼困難。我想成像你可以在大約1.5周內完成。

然而,這樣做應該會提高性能,因爲它會降低到只做大約20-30K的向量轉換,這對於大多數現代CPU來說並不需要太多的處理器能力。你也可以考慮使用Direct X,它可以讓你利用GPU,這可以帶來更大的性能提升。

+1

根據你在做什麼,WPF的GeometryDrawing和StreamGeometry類實際上比GDI +快得多,因爲它在保留模式下使用Direct3D。 GDI +適用於靜態圖像,但對於大多數情況下是靜態但有一些變化的圖像來說效果不佳。 GDI +在遠程桌面情況下也表現不佳。一般情況下,我會建議在大多數情況下使用WPF低層圖層來覆蓋GDI +,因爲所有轉換都是爲您處理的,您不必處理空間和類似問題。 – 2009-11-19 10:02:06

7

無需訴諸於GDI,您只需要在WPF API中向下移動圖層,並將幾何圖形合併爲更少的視覺效果。根據您的性能需求,Pablo Fermicola有一些關於picking which layer的有用信息。

我已經設法使用DrawingVisualDrawingContext類獲得優異的性能。

0

如果性能是一個問題,那麼你想避免可視化筆刷。這些畫筆最適合用於將屏幕的某些可見部分投影到屏幕上的其他位置。它們會導致很大的性能下降,因爲當畫筆內容發生變化時,這些畫筆會自動更新。

此刷子的任何用法都將被軟件渲染,並且將無法利用圖形卡的硬件功能。

More info from MSDN on VisualBrush

0

如果你沒有來顯示所有多邊形一次(如由於縮放,平移等),檢查出的虛擬畫布樣品鏈接到QT here

相關問題