2017-04-21 98 views
0

假設您有一個繪製複雜流程圖的應用程序(在我的例子中是一個.NET應用程序)。用戶需要以可接受的和一致的幀率導航流程圖,比方說10 FPS。這意味着如果流程圖非常龐大,您將無法在不阻止用戶界面的情況下繪製所有內容。流體2D形狀平移/滾動

此外,形狀複雜變化很大,你想畫的許多形狀,儘可能給用戶的印象無非是在動態運動失蹤。

我測試的第一種方法是計算需要多少時間繪製單個框架(保持10 FPS),並在達到該閾值後停止繪製,顯然會跳出屏幕。

結果很不好。如果沒有任何關於首先繪製什麼的邏輯,繪圖可能會卡住一些複雜的形狀,並跳過大部分簡單的形狀(給用戶造成他/她丟失圖表的印象)。此外,估計的幀率可能會有相當大的變化,因此繪製的圖形數量也會有所不同。

你知道一個更好的方法可循?你知道關於這個主題的任何文章嗎?

謝謝。

+1

做一個第一件事情是一個邊界框關聯到每一個項目,並用它做決定,如果它的任何部分都將在窗口中可見。在第二步中,您可以在嵌套框的樹中組織框,這將允許快速拒絕組的項目。請參閱https://en.wikipedia.org/wiki/R-tree –

回答

0

第一種優化嘗試是你的形狀從排序不太複雜更復雜然後做你有時間的圖。這樣一般你應該跳過較少的對象,這意味着屏幕上有更多的對象。 當用戶停止移動時,您可以運行完整的繪圖。我想我已經注意到PDF文件中的一些矢量圖中的類似行爲。

另一種方式是在可能的時候重用已經繪製的圖像。 將2D矩形參數添加到繪圖代碼中,並在每個對象碰到矩形時測試它們,矩形用作繪圖的邊界框。 當用戶移動流程圖時,向左邊說10個像素 - 複製當前圖像,將它移動10個像素,然後在右側畫一個10像素寬的垂直條 - 這樣可以減少要考慮的對象。 這種方法是在Qt 2D場景中實現的,有很多技巧和優化,使得它對編碼器來說幾乎是透明的。非常有趣的實現,但很難閱讀:)。

您也可以探索線程和所有posibilities它給你:

你可能只是做圖形中另一個線程不阻塞GUI。如果線程結束繪製圖像,您只需在窗口中顯示它。

您可能圖表拆分成正方形/長方形,並給每平方到不同的線程。當視圖移動並且新的方塊變得可見時,執行繪製。在主線程中,您只需檢查已完成的操作並將其複製到目標位置。移動Web瀏覽器以類似的方式呈現網頁。

根據您的確切內容和偏好,在移動過程中應該看起來如何,您還可以將圖表分成若干圖層 - 重要程度越來越低等。然後,在主線程中,您只需混合/混合準備好的圖像,等待別人。