在MFC中重绘时闪烁

时间:2010-09-20 11:51:31

标签: c++ mfc

我正在使用C ++和MFC编写一个俄罗斯方块游戏。我有一个计时器和OnTimer处理程序。 Handler看起来像这样:

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

在OnPaint处理程序中,我绘制块,地图(带位图背景),得分等。对于绘图我使用位图和BitBlt函数。一切都是从头开始绘制的,我重绘了整个窗口区域。总体性能是正常的,有时闪烁,但没关系,但是当我将位图背景添加到地图时,闪烁同时重绘变得难以忍受。我是否必须使用其他算法来绘制位图,或者每次触发OnPaint时都可能错误地执行所有重绘?

如何消除闪烁?我只能使用C ++和MFC,不幸的是后者在开始这个项目之前完全不知道。

所以,再次说明:如何消除闪烁并提高重绘效果?

4 个答案:

答案 0 :(得分:6)

尝试覆盖CWnd::OnEraseBkgnd以返回非零值。这告诉窗口你已经处理过自己擦除窗口背景。

答案 1 :(得分:6)

尝试双缓冲。 “双缓冲”是指写入存储器DC然后将存储器DC BitBlt到屏幕的技术。

与Windows相关,此技术可用于处理WM_PAINT消息。 OnDraw函数调用BitBlt将内存DC复制到屏幕DC中。内存DC与视图类中的成员变量相关联,并在没有其他消息被处理的时间内写入。

以下是一些可以提供帮助的代码的link

答案 2 :(得分:1)

一种可能的解决方案是为所有绘图创建一个内存位图(DC),然后在完成所有绘图后将其blit到屏幕中。当您逐个绘制所有屏幕实体时,可能会出现闪烁。如果使用内存中的位图,则不会出现任何闪烁现象。这是伪代码:

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

答案 3 :(得分:0)

你应该同时使用以前的两个。

如果要绘制整个窗口区域,则应覆盖OnEraseBkgnd(如建议的sje397),以避免Windows以灰色绘制背景。那是什么导致了闪烁。

但你也可以更好地应用Double-Buffering技术。这样,绘图将在内存中一次完成复制到屏幕。这也将改善您的表现。

祝你好运。