採用四緩衝提高自繪介面的效率

鄧學彬發表於2011-06-09

做過自繪的朋友都知道,如果直接畫到視窗DC上,頻繁更新會導致視窗比較閃。所以大家都喜歡使用雙緩衝解決這個問題。(即先畫到記憶體DC,全部畫完了再一次複製到視窗DC上)。
在編寫DirectUI介面時,子控制元件並不是真實存在的視窗,只是直接畫到同一個視窗上的一些子區域。如果每一個子控制元件更新狀態(比如獲取焦點、滑鼠熱點及按下等狀態)都重畫所有子控制元件,那效率就低了,採用GDIPlus時這個效率的區別更明顯,CPU佔用率特別高。
為解決這個問題,我在編寫“彗星小助手”時採用了更多的快取。只根據需要更新某一控制元件的狀態。

快取A->儲存整個視窗的背景(只在視窗尺寸改變時更新)
快取B->在A的基礎上,畫出所有子控制元件
快取C->複製B,複製當前重畫子控制元件(比如“正則除錯”這個子控制元件)所佔區域的背景(即A),再畫出子控制元件(正則除錯)的最新狀態,最後複製到視窗DC(假設為D)。

這樣做,儲存了更多GDI物件,記憶體佔用會稍高,但是CPU佔用大幅度降低,不會因為子控制元件過多而導致“卡”一下的現象。子控制元件越多越明顯。

在這裡,包括視窗DC在內,一共採用了四個DC,或許應該叫四緩衝吧,呵呵。

示意圖如下:

相關文章