在写大作业的时候一开始用gdi+,可以手写出双缓冲,后来因为性能问题和环境配置问题转用direct2d,却在双缓冲的问题上卡顿许久,并且画出的图形也有很明显的闪烁。查阅国内博客许久依然没有答案,于StackOverflow上见一提问:

https://stackoverflow.com/questions/42332131/double-buffering-in-direct2d

与此篇文档:

https://docs.microsoft.com/en-us/windows/win32/api/d2d1/nn-d2d1-id2d1hwndrendertarget?redirectedfrom=MSDN

两者指出在d2d中,RenderTarget本身的特性就是双缓冲,不同的是,对于客户区的绘制  是在RenderTarget::EndDraw()之后完成,至此真相大白。

之前的code:

 

 

 mapShow()函数和drawImage()函数中均有一对pRenderTarget->BeginDraw()和pRenderTarget->EndDraw(),在这样的情况下,每一次重绘都分两步完成:绘制背景和绘制飞行物。

将代码改为:

 

 

在 mapShow()函数和drawImage()函数中把BeginDraw()和EndDraw()中都去掉,

这样就能将背景和飞行物同时绘制入缓冲后一次性绘制到客户区。

最后效果:

 

 

 闪烁问题解决!