2010-09-20 70 views
1

我正在使用C++和MFC編寫俄羅斯方塊遊戲。我有一個計時器和OnTimer處理程序。處理程序是這樣的:在MFC中重繪時閃爍

... do some game-only logic ... 
this->RedrawWindow(); 

而在OnPaint處理我畫塊,圖(位圖背景),得分等繪製我使用位圖和BitBlt函數。一切都從頭開始,我重繪整個窗口區域。整體性能是正常的,有時閃爍,但沒關係,但是當我將位圖背景添加到地圖時,重繪時閃爍變得難以忍受。我是否必須使用其他算法來繪製位圖,或者可能是我在每次觸發OnPaint時執行所有重繪時出錯?

我該如何消除閃爍?我只能使用C++和MFC,後一個不幸我在開始這個項目之前根本不知道。

那麼,我又該如何消除閃爍並提高重繪的性能呢?

+1

檢查這個答案也是:http://stackoverflow.com/questions/197948/reduce-flicker-with-gdi-and-c/199526#199526 – djeidot 2010-09-22 11:45:06

回答

6

嘗試雙緩衝。 「雙緩衝」是指寫入存儲器DC然後將存儲器DC BitBlt-ing到屏幕的技術。

與Windows相關的技術可以用來處理WM_PAINT消息。您的OnDraw函數調用BitBlt將內存DC複製到屏幕DC中。內存DC與視圖類中的成員變量關聯,並在沒有其他消息正在處理的時候寫入。

這是一個link的一些代碼,可以提供幫助。

1

一種可能的解決方案是爲所有圖形設置一個內存位圖(DC),然後在完成所有繪圖後將其粘貼到屏幕中。當您逐一繪製所有屏幕實體時,可能會發生閃爍。如果您使用內存位圖,則不會有任何閃爍。這是僞代碼:

Clear Memory Buffer 
Blit the background bitmap on the Memory Buffer 
For each entity that needs to be drawn 
    Draw entity on Memory Buffer 
Blit the Memory Buffer to the screen DC 
+0

你的意思是雙緩衝。 – 2010-09-20 12:15:32

0

您應該同時應用兩個以前的焊接器。

如果您正在繪製整個窗口區域,則應該重寫OnEraseBkgnd(如sje397建議的)以避免Windows以灰色繪製背景。這是什麼導致閃爍。

但你也更好地應用雙緩衝技術。這樣,繪圖將在內存中完成,並立即複製到屏幕上。這也會改善你的表現。

祝你好運。