2010-09-08 38 views
7

我正在C#中進行遊戲(2.0或3.5 havn't尚未決定)。該遊戲將在具有六邊形網格的地圖上播放。我明白這張地圖的用戶界面應該使用雙緩衝(大量圖層,如此緩慢的繪圖)。我知道我可以通過樣式啓用雙緩衝,或創建自己的緩衝區並自行處理。我在網上找到的大多數推薦是自己處理。我想知道爲什麼?顯然這可以讓我避免控制雙緩衝所固有的假設,但我不知道這些假設是什麼。我爲什麼要做手動雙緩衝?

再說一遍,我不是找代碼來解釋如何雙緩衝我的控制,而是爲什麼我反而建立這個自己使用雙緩衝的風格,並允許CLR /控制類來處理呢?

回答

3

在WFA,雙緩衝會降低性能,而不完全消除了自定義的圖形區域閃爍。對於內置的GUI元素,就像創建一個由ImageButtons和Labels構建的遊戲一樣,內置的雙緩衝模式非常適合隱藏重繪控制樹。但是,有幾個主要的問題,將其用於自定義繪圖區域:

  • ,當你剛設置的應用程序繪製雙緩衝創建的繪圖緩衝器被用來繪製整個窗口以及所有子控件,而不僅僅是您的自定義繪圖區域,因此您需要在頁面翻轉之前添加在後臺緩衝區中重繪每個GUI元素的開銷。
  • 如果有任何操作使控件失效,則調用Paint方法。發生這種情況時您可能無法完成繪圖,因此您會看到向用戶顯示的圖像不完整(實時圖形效果不佳)。

通過保持基本窗口GUI單緩衝,但創建一個控制緩衝的區域,這兩個問題都被最小化了。

雙緩衝方法可以很簡單,只要創建一個Bitmap對象作爲後臺緩衝區並在您準備好時將其繪製到繪圖區域,或設置一個單獨的BufferedGraphicsContext來管理自定義繪製的緩衝區區。

4

MSDN

爲了圖形密集型應用程序 如動畫,有時可以 使用,而不是由 BufferedGraphicsManager提供的BufferedGraphicsContext 的 專用BufferedGraphicsContext 提高性能。這使 您可以創建和管理獨立顯卡 緩衝區,沒有 招致 管理與自己0​​應用程序相關聯的所有其他緩衝 顯卡的性能開銷,儘管應用程序佔用的內存 將 更大。

編輯:我也發現從鮑勃鮑威爾this文章可能會有所幫助

手動雙緩衝可能是有用的 ,如果你不希望系統所以請 假設你這樣的因爲 的背景是不透明的,還是 透明,或者如果你想 創建更復雜的緩衝 系統。有幾條簡單的規則 ,您需要遵循以獲得手動 雙緩衝權。

首先,不要在每個繪製週期創建新的後臺緩衝區 。當窗口的 客戶端大小更改時,僅創建或 銷燬位圖。其次,只有 可以創建您需要的大小的位圖。 清除像素需要時間,所以如果 有更多的像素比你的需要,你 只是浪費處理器週期。 最後,使用最簡單的繪製方法 將位圖複製到屏幕上。在這裏,DrawImageUnscaled是要走 的路線。

編輯:另一個原因是,您可能希望應用程序來控制緩衝,而不是控制自己。

來源:Pro .NET 2.0 Windows Forms and custom controls in C#

+0

謝謝,但我已經完成了網頁搜索:-) – 2010-09-10 14:57:21