请输入您要查询的百科知识:

 

词条 双缓冲
释义

§ 简介

这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

§ 如何实现

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。

我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用 BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪 烁。以上也就是双缓冲绘图的基本的思路。

首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)

§ 骑马抽中的双缓冲

也称作:双缓冲骑马抽、豪华双缓冲阻尼抽屉。

即骑马抽在完全拉出和关闭时都具有较好的缓冲效果,能有效避免噪音产生,把抽屉的运动惯性所产生的破坏力降低到最小,有效保护柜体和抽屉本身,对延长整个橱柜和抽屉的使用寿命有明显的效果;是一项很重要的实用新型功能发明;以欧洲波兰GRASSHOPPER库博五金独家提出该理念和发明创造该产品。可继续升级为联动双缓冲。

§ J2me 双缓冲

使用自己创建的屏幕画笔在创建画笔的屏幕上作画,然后再将画出的屏幕做为Image的对象画到改屏幕上,这样就解决了屏幕闪烁

package com.redarmy.tes;

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Graphics;

import javax.microedition.lcdui.Image;

public class ExCanvas extends Canvas{

public Image offScreen;//离屏缓冲区

public Graphics offg; //离屏画笔

public ExCanvas()

{

//绘制和屏幕一样大小的缓冲区

offScreen = Image.createImage(this.getWidth(), this.getHeight());

//得到离屏缓冲区的画笔

offg = offScreen.getGraphics();

}

protected void paint(Graphics arg0)

{

//绘制离屏缓冲区

arg0.drawImage(offScreen, 0, 0, Graphics.LEFT|Graphics.TOP);

}

}

随便看

 

百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/9/21 16:25:50