在 MFC 中重绘时闪烁
Posted
技术标签:
【中文标题】在 MFC 中重绘时闪烁【英文标题】:Flickering while redrawing in MFC 【发布时间】:2010-09-20 11:51:31 【问题描述】:我正在使用 C++ 和 MFC 编写俄罗斯方块游戏。我有一个计时器和 OnTimer 处理程序。处理程序如下所示:
... do some game-only logic ...
this->RedrawWindow();
在 OnPaint 处理程序中,我绘制块、地图(带有位图背景)、分数等。对于绘图,我使用位图和 BitBlt 函数。一切都是从头开始绘制的,我重新绘制了整个窗口区域。整体性能正常,有时会闪烁,但没关系,但是当我将位图背景添加到地图时,重绘时闪烁变得难以忍受。我是否必须使用其他算法来绘制位图,或者每次触发 OnPaint 时我在进行所有重绘时可能是错误的?
如何消除闪烁?我只能使用 C++ 和 MFC,不幸的是,在开始这个项目之前我根本不知道后者。
那么,再说一遍:如何消除闪烁并提高重绘性能?
【问题讨论】:
也检查这个答案:***.com/questions/197948/… 【参考方案1】:尝试覆盖 CWnd::OnEraseBkgnd 以仅返回非零值。这告诉窗口您已经自己处理了擦除窗口背景。
【讨论】:
【参考方案2】:尝试双缓冲。 “双缓冲”是指写入内存 DC,然后将内存 DC BitBlt-ing 到屏幕的技术。
结合 Windows,此技术可用于处理 WM_PAINT 消息。您的 OnDraw 函数调用 BitBlt 将内存 DC 复制到屏幕 DC。内存 DC 与视图类中的成员变量相关联,并在没有其他消息正在处理时写入。
这里有一个link 可以提供一些帮助的代码。
【讨论】:
【参考方案3】:一种可能的解决方案是为所有绘图创建一个内存位图 (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
【讨论】:
【参考方案4】:您应该同时应用之前的两个答案。
如果您正在绘制整个窗口区域,则应覆盖 OnEraseBkgnd(如 sje397 建议的那样)以避免 Windows 将背景绘制为灰色。这就是导致闪烁的原因。
但您也最好应用双缓冲技术。这样,绘图将在内存中完成,一次复制到屏幕上。这也将提高您的表现。
祝你好运。
【讨论】:
以上是关于在 MFC 中重绘时闪烁的主要内容,如果未能解决你的问题,请参考以下文章