2014-02-12 42 views
0

十年前,我創建了一個簡單的Tetris遊戲來學習.NET和WinForms。我創建了一個由標籤控件組成的10乘30網格。這些標籤鏈接到包含每個塊的圖像的ImageList。幾個星期前,我的朋友要求參加局域網聚會的俄羅斯方塊遊戲,所以我參加了我的舊俄羅斯方塊遊戲,並複製了網格和標籤以支持10名玩家。帶有數千個控件的Winform渲染性能

遊戲核心工作完美。但是,有3000多個標籤,渲染開始困難。

所以這裏是我的問題:有沒有辦法來改善我的應用程序的渲染?

我可以更換標籤的其他用戶的控制,但我想,以避免陷入的DirectX/OpenGL繪圖(即使是最好的解決辦法,我沒有足夠的時間去通的學習曲線)

回答

2

這是一個非常緩慢的方式,你不能真正期望它執行得很快。 你可以做的只是使用1個控件而不是數千個控件 - 它可以作爲繪圖畫布。

您應該重寫控件上的onpaint事件並以這種方式繪製遊戲狀態。 您會在事件參數中找到一個圖形對象,並使用像FillRectangle這樣的函數,您應該可以繪製所有內容。

儘管這也會導致一些閃爍,但WinForms並不適用於這種東西 - 但它應該適用於您的情況。

我也明白,這改變了你的概念,並且需要大量的編碼改變,但它比directx/opengl路由要容易得多。

祝你好運!

+0

有趣。我會試一試,我會看看它是否適合我的代碼。 –

1

表單上的每個控件都有自己的句柄,並被視爲單獨的窗口。窗口化將無法很好地處理大量的控件(在窗口化方面,WPF不會爲每個控件使用單獨的窗口句柄,而是爲整個窗口使用單獨的窗口句柄)。

3000+控件不是一個好主意,你知道的,但我們嘗試應用樂隊幫助,儘管我們對應用程序知之甚少!

  • 儘量不要使用透明背景色,否則將支付額外的油漆通話。該控件並非真正透明,它查看其父控件的背景並將背景複製到自身(OnPaintBackground)。在您的示例中重複使用幾千個控件,您可以看到這個複合。 (如果你正在使用它)

  • 你是否隱藏任何控件,如果是的話,你是使用Visible屬性還是實現與控件的BackColor?通過使不必要的控制不可見,您可以節省不必要的塗料。注意隱藏控件與禁用它們的效果。禁用的控件仍然繪製。

  • 雖然它不會影響渲染速度,但如果您有任何閃爍,我會查看double buffering。使用從XP開始引入的WS_EX_COMPOSITED標誌,並且(據報道也可以在Windows 8中運行),這將確保雙重緩衝它的控件。它涵蓋在這個問題上:Winforms Double Buffering

+0

我知道WinForm中的句柄我不知道WPF每個窗口使用單個句柄。我會試一試。 –