2011-09-09 163 views
3

我在wxWidgets中開發了一個應用程序,在該應用程序中使用位圖進行繪製。所以,第一次當我的應用程序啓動時,它從文件中讀取座標並相應地繪製線條。應用程序還接收來自網絡的UDP數據包,UDP數據包還包含一些xy座標信息,這些信息必須在屏幕上繪製,所以當接收數據包時,我重繪位圖圖像並顯示在屏幕上,我還需要刷新位圖在鼠標移動事件上,因爲在鼠標移動時會出現一些我必須在屏幕上繪製的新圖形。最佳繪圖方法

所有這些都會增加運營成本並降低我的GUI。所以,請好好建議我一些替代繪圖方法,您認爲這種方法可能會有效。

我已經在Google上搜索過,並獲得了OpenGL的選項,但由於時間不足,我不想使用openGL,因爲我沒有任何OpenGL的經驗。

+4

您有1337分。我不喜歡那樣。 Upvoted:P – Flavius

+1

你不能在內存中保存一個位圖實例,只需要繪製新的信息,而不用重繪整個事物?並拉伸blit位圖屏幕... – Lucian

+0

@freerider,我正在繪製一些特定的內存信息,但是當我必須從位圖中刪除現有的線和繪製新的線,在這種情況下,我必須重繪整個位圖。 – Siddiqui

回答

0

保存數據以繪製而不是總是刷新位圖,並讓主循環不時刷新位圖。

這樣你就可以使程序永不停止。背面當然是反應性會更低(即數據到達時,屏幕上不會再出現20毫秒而不是立即顯示)。

1

聽起來好像您的問題在於您的GUI對用戶輸入沒有響應,因爲應用程序正忙於重繪顯示。對這類問題有幾個通用的解決方案。

  1. 使用工作線程在內存中繪製位圖。在這種情況下,主線程可以繼續與用戶交互。一旦位圖被重新繪製,工作線程就會向主線程發出信號,然後主線程將完成的位圖複製到屏幕 - 這非常快。

  2. 使用主線程直接在屏幕上繪製位圖,但通過調用wxApp :: Yield()來繪製繪圖代碼。這將允許GUI在漫長的繪圖過程中保持對用戶的響應。

選項1是「最好的」,在多核機器上運行尤其是,但它是保持同步的兩個線程,防止它們之間的競爭,除非你有一個多線程的設計顯著的經驗是一個挑戰。選項2非常簡單,但您仍然必須小心,在第一個完成之前用戶交互不會啓動另一個繪圖過程。

+0

這不會改變任何東西,「繪畫回憶」是一種無意義的東西(否則你會畫出什麼?)。使用2個線程,一個用於繪製,另一個用於執行代碼並不是一個糟糕的IDE,但您必須將這兩個線程連接在一起(即繪製時不計算,計算低收益時不計算)。 OP想要一個簡單的(或不是太複雜的)解決方案來解決他的問題,「不要每幀更新GUI,因爲這需要時間」。喜歡還是不喜歡:-) – Valmond