2009-09-11 71 views
25

創建新表單後,我通常會執行這個儀式:爲什麼DoubleBuffered默認禁用?

  1. 將名稱改爲有意義的;
  2. 輸入a Caption;
  3. 更改位置屬性(DefaultPosOnly幾乎不會滿足用戶的期望);
  4. ShowHint設置爲true;
  5. Set DoubleBuffered to true;

我一直想知道爲什麼默認值是'假'。對我來說,它只是低技術和蹩腳的,在我的新機器上,我沒有注意到性能上的差異。

舊計算機,VNC,遠程桌面或虛擬機上的doublebuffering問題可能是?

你把它打開還是關閉?任何建議?

回答

32

正如您可能知道的,雙緩衝區通常涉及創建與視覺組件大小相同的屏幕外緩衝區。在此緩衝區上執行寫入/繪圖,完成後,整個緩衝區將「交換」,以便它現在繪製在可視組件上。

(注:「交換」可以包括簡單地改變地址的指針指向,或實際上可能涉及複製的存儲器塊,例如使用的BitBlt,memcpy的等)

因此存儲器的合理量分配爲每個支持該組件的進程提供支持。如果您的應用程序有很多窗口或/和組件,則分配的內存量不會很少。如果你不需要流暢的視覺更新/滾動,爲什麼浪費這些內存?

當然也有一種說法,那就是今天大多數電腦都有足夠的內存可用,所以爲什麼要擔心。不過,如果你不需要它,我仍然不認爲這是默認啓用雙緩衝的理由。

如果手動將DoubleBuffered設置爲true對您而言是一種痛苦,那麼您可以始終創建自己的自定義控件/繼承自內置控件的組件,並將DoubleBuffered(和其他屬性)設置爲所需的默認值。

+1

+1不錯的答案。 Nitpick:將「快速複製」替換爲「交換」或其他沒有給出印象的其他內容,實際上是進行緩衝區複製。緩衝區交換通常是簡單的指針交換。 – 2009-09-11 02:21:54

+0

好點,我已經更新了答案。當然,在Windows Forms.NET中,還有一個「假裝」雙緩衝,實際上它只是一個內存拷貝。 – Ash 2009-09-11 02:26:56

+11

當'DoubleBuffered'爲true時,控件響應如下的畫圖消息:它創建一個位圖,繪製位圖,調用BitBlt將位圖複製到窗口上,然後銷燬該位圖。這不僅僅是一個簡單的指針交換。 – 2009-09-11 04:49:21

12

在現代操作系統上進行桌面合成雙緩衝實際上可能會降低性能。無論如何,渲染是在離屏位圖中執行的,所以使用雙緩衝會導致額外的複製,而這些複製在這些系統上根本沒有任何好處。所以除非VCL在這種情況下足夠聰明以忽略雙緩衝(不知道它是否需要檢查),否則無法無條件設置它實際上會更好。

編輯:

我檢查,並在這兩個德爾福2007年和2009年德爾福的TWinControl.WMPaint方法不使用雙緩衝時DwmCompositionEnabled回報True。尼斯。

25

做某種類型的遠程桌面時要避免雙緩衝,因爲必須通過網絡發送控件/表單的整個位圖來完成BitBlt。見this blog post ...

+3

+1真棒。如此明顯,只要您指出,但我從來沒有想到會發生這種情況。這將使我重新思考我的一些程序....感謝您指出這一點! – robsoft 2009-09-11 12:04:13

+0

+1同意上面提到的內容! – user271077 2010-10-11 21:04:49

1

您也可以創建一個設計時專家,爲您創建的每個表單/控件自動設置此值,而不是爲每個現有工作都派生新的控件,這將涉及更多的工作。 查看GExperts.org的源代碼,瞭解如何實現這一點。