双缓存技术
1. 怎样在MFC中用双缓存技术画直线,即鼠标点一下开始画线,线随鼠标移动,再次按下即画出直线。
双缓存?
这个我不清楚,原来还有这样的命名,呵呵~
首先,鼠标左键点击按下的消息响应ON_WM_RBUTTONDOWN(),这时候确立第一个点。
其次,鼠标移动的消息响应ON_WM_MOUSEMOVE(),这是关键。这里因为你要线随鼠标移动,如果你直接把当前点与第一步所得的点连接的话,你会发现整张图都是线。所以这里就需要你把原图复制一张出来并显示这张图(替换原图显示),然后每次响应鼠标移动的时候将当前点与第一步所得的点连接并画在这张复制出来的图上。
最后,鼠标左键点击放开的消息响应ON_WM_LBUTTONUP()。这时候是确立最终点的。你只需画在原图上,并显示该图,并释放你复制出来的那张图就行了。
这是鼠标按下到放开形成一条直线的,你要2次点击也可以,就是在ON_WM_RBUTTONDOWN()做个前后点击的判断取代ON_WM_RBUTTONUP()。代码自己根据实际应用写吧。
2. 什么叫双缓存处理
绝大多数支持OpenGL的3D加速卡都会提供两组图形画面信息,一组显示,另一组备用,这两组图形画面信息通常被看着front buffer和back buffer。这项功能让显示卡用front buffer存放正在显示的这格画面,而同时下一格画面已经在back buffer待命。
3. CPU缓存的二级缓存
Intel的双核心CPU主要有Pentium D、Pentium EE、Core Duo三种,其中Pentium D、Pentium EE的二级缓存方式完全相同。Pentium D和Pentium EE的二级缓存都是CPU内部两个内核具有互相独立的二级缓存,其中,8xx系列的Smithfield核心CPU为每核心1MB,而9xx系列的Presler核心CPU为每核心2MB。这种CPU内部的两个内核之间的缓存数据同步是依靠位于主板北桥芯片上的仲裁单元通过前端总线在两个核心之间传输来实现的,所以其数据延迟问题比较严重,性能并不尽如人意。
Core Duo使用的核心为Yonah,它的二级缓存则是两个核心共享2MB的二级缓存,共享式的二级缓存配合Intel的“Smart cache”共享缓存技术,实现了真正意义上的缓存数据同步,大幅度降低了数据延迟,减少了对前端总线的占用,性能表现不错,是目前双核心处理器上最先进的二级缓存架构。今后Intel的双核心处理器的二级缓存都会采用这种两个内核共享二级缓存的“Smart cache”共享缓存技术。 Athlon 64 X2 CPU的核心主要有Manchester和Toledo两种,他们的二级缓存都是CPU内部两个内核具有互相独立的二级缓存,其中,Manchester核心为每核心512KB,而Toledo核心为每核心1MB。处理器内部的两个内核之间的缓存数据同步是依靠CPU内置的System Request Interface(系统请求接口,SRI)控制,传输在CPU内部即可实现。这样一来,不但CPU资源占用很小,而且不必占用内存总线资源,数据延迟也比Intel的Smithfield核心和Presler核心大为减少,协作效率明显胜过这两种核心。不过,由于这种方式仍然是两个内核的缓存相互独立,从架构上来看也明显不如以Yonah核心为代表的Intel的共享缓存技术Smart Cache。
4. c++双缓冲技术有问题
你98-105行的代码就是循环写缓冲区并重新设置控制台缓冲区,但是你貌似放在了二重for循环里面。而你69-76行的代码执行的操作和98-105行一模一样,但是这一块代码在二重for循环外面。因此我认为应该是98-105行的代码块在二重for循环里面导致的问题。
不过说实话你48-68行的二重for循环不是应该执行一次就够了吗?第一遍执行完了map数组里面的数字已经被替换为了字符,后面再进行for循环把数字转化为字符感觉多余了。
5. 简单说下c#中,双缓存技术有什麽用
那不叫双缓存,而叫双缓冲。
双缓冲通常用于屏幕绘图,减少因频繁刷新图形而带来的闪烁感。其原理是在屏幕图形缓冲区外新建一个独立的缓冲区,并在上面绘制图形,等一系列绘制完成后,再将整个图形发送到当前的屏幕缓冲区,从而避免因绘制过程比较缓慢带来视觉上的闪烁。
6. C#中两张及以上的位图怎么使用双缓冲技术使得不闪烁
通过图层实现,建立一个要绘制的对象列表,按顺序通通交给当前的graphic绘制。
分三个类来实现的,
画板(管理双缓冲List<BufferedGraphics>,负责给出当前的Graphics,以及呈现画面BufferedGraphics.Render)
I绘制(Graphics g)需要调用Graphics绘图的对象。
在我的引擎里面有图像、精灵、动画精灵、各种控件都实现了这个接口。
图层(存有一个列表,里面是I绘制),它本身也是一个I绘制(可以嵌套到其他图层)
/// <summary>
/// 能调用Graphics来进行绘制工作。
/// <para>通常为图像、文字、精灵、控件等</para>
/// </summary>
public interface I绘制 { void 绘制(Graphicsg); }
/// <summary>图层可嵌套子图层。</summary>
public class 图层 : I绘制 {
public 图层() { }
/// <summary>新建图层的同时新建指定数量的子图层。</summary>
public 图层(int 子图层数量) { for (int i = 1; i <= 子图层数量; i++) { 新建图层(); } }
public RectangleF 剪辑区域 { get; set; }
public bool 应用剪辑 { get; set; }
public SortedList<int, I绘制> I绘制集 = new SortedList<int, I绘制> ();
SortedList<int, 图层> 子图层 = new SortedList<int, 图层>();
public 图层 this[int 序号] { get { return 子图层[序号]; } }
public SortedList<int, 图层> 序列 {get { return 子图层; } }
public void 绘制(Graphics g)
{
if (应用剪辑) { g.设置剪辑区域(剪辑区域, CombineMode.Intersect); }
foreach (var 项 in I绘制集){ 项.Value.绘制(g); } //绘制集绘制
foreach (var 项 in 子图层) { 项.Value.绘制(g); } //子图层绘制
}
public void 添加(I绘制 I绘制) { I绘制集.Add(I绘制集.Count, I绘制); }
public bool 移除(int 序号) { return I绘制集.Remove(序号); }
}
然后具体场景.更新过程就是
其中画家就是对Graphics的封装,把一些Graphics的方法翻译成了中文而已。
/// <summary>更新场景,将令画家读取画板中的画纸,绘制所有图层内容,并自动呈现。</summary>
public void 更新() {
if (画板 == null) { return; }
if (画家 == null) { return; }
//给画家指定画纸 - 必须在每帧绘制前更新的语句
画家.设置画纸(画板.当前画纸);
//清空画纸 - 必须在每帧绘制前更新的语句
画家.清空();
if (绘制图层前 != null) { 绘制图层前.Invoke(); }
图层.绘制(画家);
if (绘制图层后 != null) { 绘制图层后.Invoke(); }
//绘制帧数文字
if (计算帧数 && 帧数文字 != null && 帧数文字.隐藏 == false) {
帧数文字.文本 = 帧数.平均帧率.ToString(帧数文字格式);
帧数文字.绘制(画家);
}
//画板呈现 - 必须在每帧绘制后更新的语句
画板.呈现();
if (计算帧数) { 帧数.更新(); }
}
7. 什么是双缓冲
可是,我却对双缓冲这个词感到莫名其妙
双缓冲听起来好像很深奥,其实其本质很简单:就是先生成一张位图,然后把所有的绘图工作都画的这张位图上,然后再将这张位图一次性画到屏幕中去。
它的关键技术就是: 不要直接在屏幕上画图,而是将所有的绘图工作先绘制到图片上
我们研究下从开始绘图到屏幕显示图像的过程
第一步: 将所有的绘图缓冲到位图中
第二步:将位图拷贝到屏幕上,此时相当于所有的绘图又跳跃到了屏幕
绘图进行了两次跳跃:第一次跳跃到位图中,第二次跳跃到屏幕上,所以这种技术可以称之为双缓冲
闪烁的原因就是新图和旧图直接的差别造成的。
1) 更新时,先使用背景刷 刷一下背景,然后再贴图 背景刷和图像之间的差别能造成闪烁,这点可通过响应察除背景刷消息来消除 OnEraseBkgnd(CDC* pDC)
2) 先画一张白色图片,然后再在白色图片上画红色矩形
此时,背景刷问题解决了,但是在屏幕上 首先贴一张白图,然后再白图上画一个红色矩形,二者颜色差别明显,如果频繁绘图时,便不可避免的产生闪烁。
那如果使用双缓冲,此种现象便可以消除,分析如下:
先把白色图画到内存位图中,然后再将红色矩形画到这个内存位图中,最后将这个位图拷贝到屏幕上。
由于原屏幕上的图像与位图中的图像差别很小(都是白色图和红矩形),因此当频繁绘图时,可有效降低闪烁
鄙视一下 那些讲不清道理,又不肯给出实例的家伙--0--
以下是伪代码:
8. 关于java中利用BufferedImage的双缓冲技术
双缓冲就是先在内存中的另一张“画布”上进行多次绘图,然后把画好的图在一次性画到屏幕上,也就是最后一步的g.drawimage。简单的说,一个graphics对应着自己的绘图区域图形上下文