2010-08-17 118 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函数必须被调用,以释放设备上下文。