2012-06-11 21 views
0

我處於這種情況,我有代表遊戲對象的文本文件。 我所要做的就是解析文件並獲取遊戲對象將被繪製的點。 例如批量UI更新是否值得對付BeginInvoke瓶頸?

fruits.txt 
pear 10, 20 
orange 10,38 

每當我用grep的問題,我用調度的BeginInvoke更新新的水果在屏幕上。 這比調用單個線程更好。每當我有多個屏幕並行更新它們的點時,它會變得非常緩慢,並且在畫到屏幕時開始掛起或幀跳轉。 這是因爲BeginInvoke隊列消息?儘管BeginInvoke凍結仍然比Invoke快,儘管Invoke有一個更平滑的更新。我如何讓BeginInvoke「刷新消息」來屏幕顯示。 在其他一些帖子中有一個想法,我可以將隊列中的點保存在一個隊列中,並在隊列中仍然存在某些東西時畫到屏幕上,但沒有任何區別。 請有什麼建議嗎? 謝謝。

+1

分派器機制並非真正的輕量級。如果您必須多次調用它,您可以考慮創建一個線程安全隊列並BeginInvoke一個ProcessAllItems方法。 –

回答

0

根據MSDN Control.BeginInvoke()

異步執行控制的 基礎句柄創建線程上的委託。

在你的情況下,重複調用BeginInvoke將大量調用添加到MAIN UI線程,使其與其他工作一起陷入困境。

你絕對可以在隊列中分配點數,然後立刻將它們繪製到屏幕上,而不是嘗試在同一個線程上異步運行多個繪製。

+0

你不能讓「多個抽籤在同一個線程上同步運行」,線程一次只能做一件事。但是你是正確的,因爲他在UI線程中拋出了大量不必要的消息,在這些線程中排隊並一次處理它們可能會減少他看到的「滯後」(儘管如果他正在做,它可能不會完全消除它如此多的更新立即凍結了UI線程)。 – CodingGorilla

+0

如果我必須將它們排隊,它肯定會無響應。 如何獲得批處理以便在有足夠的內容時進行更新。 我試過使用計時器,如果計時器> maxTimer基本代碼更新它,但沒有幫助。 我試着檢查隊列大小,看它是否是500,然後更新。但這些都不是最佳解決方案。 –

+0

除了實際繪製遊戲對象外,還有其他代碼正在處理嗎?如果是這樣,您可以將該邏輯移動到單獨的工作線程,並讓UI線程只處理實際的繪圖。 –