2010-08-17 120 views
0

好吧,我的雙緩衝區工作正常,但它似乎使用了大量的內存。C++雙緩衝區和內存

我知道雙緩衝區應該存儲我繪製的橢圓的副本,而不是將其繪製在屏幕上,但之後它會刪除副本並創建新副本,但似乎並未將其刪除 這裏是我的代碼

hdc=GetDC(hWnd); 
HDC memDC=CreateCompatibleDC(hdc); 
HBITMAP hMemMap=CreateCompatibleBitmap(hdc, 300, 300); 
HBITMAP hOldMap=(HBITMAP)SelectObject(memDC, hMemMap); 

// Drawing 
Graphics draw(memDC); 
draw.FillRectangle(&green, 0, 0, 300, 25); 
Font font(&fontfamily, 14, 0, UnitPixel); 
PointF p1(180.0f, 4.0f); 
PointF p2(30.0f, 4.0f); 
draw.DrawString(level, -1, &font, p2, &blue); 
draw.DrawString(str, -1, &font, p1, &blue); 
draw.FillEllipse(&red, ball1.Ex, ball1.Ey, 25, 25); 
draw.FillEllipse(&red, ball2.Ex, ball2.Ey, 25, 25); 
draw.FillEllipse(&red, ball3.Ex, ball3.Ey, 25, 25); 
draw.FillEllipse(&red, ball4.Ex, ball4.Ey, 25, 25); 
draw.FillEllipse(&red, ball5.Ex, ball5.Ey, 25, 25); 
draw.FillEllipse(&red, ball6.Ex, ball6.Ey, 25, 25); 
draw.FillEllipse(&red, ball7.Ex, ball7.Ey, 25, 25); 
draw.FillEllipse(&red, ball8.Ex, ball8.Ey, 25, 25); 
draw.FillEllipse(&red, ball9.Ex, ball9.Ey, 25, 25); 
draw.FillEllipse(&red, ball10.Ex, ball10.Ey, 25, 25); 
BitBlt(hdc, 0, 0, 300, 300, memDC, 0, 0, SRCCOPY); 
SelectObject(memDC, hOldMap); 
DeleteObject(hMemMap); 
DeleteDC(memDC); 

任何想法?

+0

當你說它沒有被刪除,你的意思是內存使用不會減少?每次調用這個函數時,內存使用量會不斷增加? – 2010-08-17 20:37:16

+1

我不知道在這種情況下,但通常雙緩衝不涉及刪除任何東西。你畫到「後臺緩衝區」(複製屏幕沒有顯示),然後當你完成時,你「交換緩衝區」,所以看起來你在同一時間畫了一切。你保留舊的緩衝區以便爲下一幀畫畫。每個框架,你交換顯示哪一個,以及你繪製哪一個。在像這樣的設計中沒有空間去分配...... – 2010-08-17 20:42:54

+0

是的,它增加了。但它不會減少 – Ramilol 2010-08-17 20:43:03

回答

1

您正在銷燬所有對象,但不是DC。繪圖後您必須調用ReleaseDC。

MSDN

有一個共同的設備上下文畫後,ReleaseDC函數必須被調用,以釋放設備上下文。