![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
VC编程,背景位图闪烁问题?
我写了一个单文档应用程序,需要用定时器。我在OnDraw函数里绘制了程序的背景位图,当定时器满足条件时使窗口重绘,但这时背景总是闪烁。如何才能不让它闪烁呢?网上说用双缓冲...
我写了一个单文档应用程序,需要用定时器。我在OnDraw函数里绘制了程序的背景位图,当定时器满足条件时使窗口重绘,但这时背景总是闪烁。如何才能不让它闪烁呢?网上说用双缓冲办法来实现,可是我没太看明白这个方法,能给解释一下么?
请写的稍微详细点,新手! 展开
请写的稍微详细点,新手! 展开
展开全部
我就以自己的理解讲一讲什么是双缓冲。一般显示器显示画面是1秒钟60帧,也就是每隔1/60秒,显示器会重新绘制一遍显示画面。如果画面是静态的,想象一下,画面的上半部分被重新绘制,画面的下半部分还是原有1/60秒之前留下的,但上下两部分合成仍然保留着原有静态画面的图像;如果画面是动态的,即前1/60秒和后1/60秒的画面不同,那么上下两部分合成的效果是画面有被撕裂的感觉。所以如果直接在显示表面(显示表面是一块内存,知道这个就可以了)上更新画面就会产生闪烁的效果。
有两种解决方法:1、仍然直接在显示表面上更新画面,但是在垂直同步的时候更新,即控制更新的时机。这种方法的问题是如果要显示的场景很复杂,更新无法在垂直同步的时间间隔内做完,那么仍然会产生闪烁的效果。
2、双缓存。建立一张离屏表面(区别于前面的显示表面),在离屏表面上做更新操作,即在离屏表面上绘制下一帧将要显示的画面。如果是VC,显示的时候,就是把离屏表面上的内容拷贝到显示表面上,显示出来;如果是Direct3D,显示的时候,可以将离屏表面和显示表面交换一下,即离屏表面变成显示表面,显示表面变成离屏表面。
在VC中,双缓冲的操作一般是先将要显示的画面绘制到一张位图上,然后将这张位图bitblt到当前的DC(设备上下文)中显示出来。
不知道能不能让你明白。祝你好运!
有两种解决方法:1、仍然直接在显示表面上更新画面,但是在垂直同步的时候更新,即控制更新的时机。这种方法的问题是如果要显示的场景很复杂,更新无法在垂直同步的时间间隔内做完,那么仍然会产生闪烁的效果。
2、双缓存。建立一张离屏表面(区别于前面的显示表面),在离屏表面上做更新操作,即在离屏表面上绘制下一帧将要显示的画面。如果是VC,显示的时候,就是把离屏表面上的内容拷贝到显示表面上,显示出来;如果是Direct3D,显示的时候,可以将离屏表面和显示表面交换一下,即离屏表面变成显示表面,显示表面变成离屏表面。
在VC中,双缓冲的操作一般是先将要显示的画面绘制到一张位图上,然后将这张位图bitblt到当前的DC(设备上下文)中显示出来。
不知道能不能让你明白。祝你好运!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询