簡體   English   中英

wpf(太多的繪圖視覺效果)導致抖動平移和縮放

[英]wpf (too many drawing visuals) cause jittery pan and zoom

在畫布中,我有大約2000個框架元素派生項目。其中包含大約12000個繪圖視覺效果。 此畫布表示復雜機器的二維視圖。 這個畫布有平移和縮放邏輯。
畫面很快......但是當機器/繪圖完全裝滿時......然后平移和縮放非常緊張..

我可以在.net4中應用bitmapcache功能,使其快速發展。 然后問題是,當畫布放大時看到細節..可以看到像素塊..這是非常難看的..

有沒有辦法加快這個。


我沒有找到任何合理的答案..

我試過這樣的..首先我有10000個框架元素,它代表了簡單的形狀,如矩形和圓形......它很慢......

然后我嘗試了一個框架元素,其中包含10000個繪圖視覺效果..仍然很慢..

然后我嘗試了一個框架元素,其中包含一個包含10000個繪圖的繪圖視圖..仍然很慢......

我會開始賞金,我不能一直設置bitmapcache,因為圖形太可怕了。

所以我現在正在做的是,在我右鍵單擊進行平移時,我使用bitmapcache轉換所有控件,當我釋放按鈕時,我刪除了bitmapcache。 像這樣,當我平移時它只是可怕的,但它非常流暢。

問題是當我用bitmapcache轉換所有東西時(或當我刪除它時),當我完全縮小時需要大約1秒或2秒......等待那段時間是不可接受的......

對於表演,是的,我們凍結了我們所能做的一切。

編輯:

我剛嘗試了一台野獸電腦:雙四核3.6ghz,6GB顯卡,16GB RAM,SSD,一切....而且需要1秒才能將所有控制轉換為緩存...如果我不緩存它落后很多

嘗試使用以兩倍的分辨率創建緩存的位圖,以便在放大其較少的像素化時。 甚至可能嘗試3倍的分辨率......顯然在某些時候會有記憶權交換。 請注意,bitmapcache大小限制為2048x2048。


否則,您可以實現自己的位圖緩存策略 - 也許實現您自己的ScrollViewer和IScrollInfo,並使用RenderTargetBitmap創建您自己的緩存位圖,並在您平移時將該位圖覆蓋到畫布上(並分離/隱藏另一組視覺效果)縮放。 為了避免在縮放/平移開始時創建位圖(即渲染所有這些視覺效果)的延遲,只要圖形被修改,就可以將“機器”渲染為背景中的高分辨率圖像,因此它已准備就緒立即使用。

http://www.codeproject.com/Articles/97871/WPF-simple-zoom-and-drag-support-in-a-ScrollViewer


如果您的復雜機器的2d視圖是只讀/不編輯的,那么您可以使用深度縮放。 棘手的一點是生成高分辨率圖像並創建.dzi文件。 你必須在網絡服務器上托管.dzi。

http://www.codeproject.com/Articles/128695/Deep-Zoom-for-WPF

如果您可以生成不同分辨率的圖像集,則可以通過以下方式將它們組合在一起構建.dzi。

http://jimlynn.wordpress.com/2008/11/28/programmatically-create-deep-zoom-collections/

允許分析.dzi文件。

http://www.deepzoompublisher.com/Viewer/


或者您可以嘗試ZoomableApplication2,它聲稱能夠虛擬化一百萬個項目......當您放大以減少正在處理的元素時,這將有所幫助......但是當您處於正常的1:1視圖時則不會。 http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx

你是如何進行平移和縮放的? 如果它們以一種使Canvas布局無效的方式完成,那么你可能會在每一幀上進行一次完整的測量和排列傳遞(或者只是排列),這會很快地減慢很多元素的速度。 如果您可以使用Canvas的RenderTransform進行操作,則不需要在每次移動時重新計算布局。

嘗試的另一件事是嘗試盡可能地減少FrameworkElements的數量,可能是讓一個中間人占用你當前的一堆對象並吐出一個Visual來代表這個視圖中的所有對象。 顯然,這樣做不會有相同的交互功能,但我再也不確定您的具體需求。

使用四叉樹怎么樣?

對於(2d)具有巨大水平的游戲,顯然你永遠不會畫出整個世界,只有可以看到的東西。

使用四叉樹將允許您非常便宜地跟蹤對象位置,稍后繪制時只繪制在屏幕上可見的(四叉樹)節點上看到的對象。 但這需要你自己的繪圖程序。

以下是我如何找到繪制內容的一些代碼, https://gamedev.stackexchange.com/questions/29121/organize-a-game-set

另外,

繪制10K FrameworkElement,12K DrawingVisual是一個或者兩個數量級太高的訂單。 如果你必須保留這些類型IMO,每個容器應該有更多的圖紙,這樣你將減少一些開銷。

您可能會對此感興趣(Virtualized WPF Canvas): http //blogs.msdn.com/b/kaelr/archive/2009/05/21/priorityquadtree.aspx

我個人轉而使用OpenGL來獲得高性能,但我認為這是一個極端的解決方案:-)))

請參閱此處獲取具有Pan和Zoom的WPF VirtualCanvas實現,該實現可顯示一百萬個項目: ZoomableApplication2:百萬項

不確定它是否適用於您的代碼,但您可以在視覺元素上使用“凍結”來提高性能。

您可以將.NET 4.0與新的CacheMode API一起使用,它將極大地提升性能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM