当前位置:首页 » 文件管理 » c双缓存

c双缓存

发布时间: 2022-11-12 13:08:37

c语言编五子棋每次下棋时清屏再输出闪屏很厉害怎么解决

一般来说清屏了再重新绘制棋子都会导致闪屏的问题,最简单的方法就是每次只绘制一个棋子。
复杂方案:造成闪屏的主要问题是:重新绘制棋子时间过长,因此一般使用双缓存,现在后台绘制好屏幕内容,然后一次性输出到前台。
比如MFC的方案:http://blog.csdn.net/toss156/article/details/7462689
其它语言的也可以在网上找找!

❷ C语言里如何设置缓冲区,

很简单的定义一个数组,用两个变量下标来指向头和尾,新数据来尾++ 老数据处理完头++ 两个下标超过界限时从头开始循环利用 中间要考虑缓存数据空和数据满的情况

或者你动态分配空间,来一个信号分配空间,插入队列链表,处理完一个出队列,释放空间

❸ VC双缓存问题

使用以下的双缓冲类封装类CMenDC 来简单地实现 双缓冲绘图。
具体到你这里,只需这样。

void ***::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();

CClientDC clientdc(this);

CMenDC dc(&clientdc);
//之后就可以用dc绘图了。

DrawZDM(dc);//绘图函数
}

/****************************************************************************
以下代码复制后保存为一个头文件即可。
****************************************************************************/

#ifndef _MEMDC_H_
#define _MEMDC_H_

//////////////////////////////////////////////////
// CMemDC - memory DC
//
// Author: Keith Rule
// Email: [email protected]
// Copyright 1996-2002, Keith Rule
//
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
// History - 10/3/97 Fixed scrolling bug.
// Added print support. - KR
//
// 11/3/99 Fixed most common complaint. Added
// background color fill. - KR
//
// 11/3/99 Added support for mapping modes other than
// MM_TEXT as suggested by Lee Sang Hun. - KR
//
// 02/11/02 Added support for CScrollView as supplied
// by Gary Kirkham. - KR
//
// This class implements a memory Device Context which allows
// flicker free drawing.

class CMemDC : public CDC
{
private:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.

public:
CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
{
ASSERT(pDC != NULL);

// Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;
m_bMemDC = !pDC-> IsPrinting();

// Get the rectangle to draw
if (pRect == NULL) {
pDC-> GetClipBox(&m_rect);
}
else {
m_rect = *pRect;
}

if (m_bMemDC) {
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC-> LPtoDP(&m_rect);

m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap);

SetMapMode(pDC-> GetMapMode());

SetWindowExt(pDC-> GetWindowExt());
SetViewportExt(pDC-> GetViewportExt());

pDC-> DPtoLP(&m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
}
else {
// Make a of the relevent parts of the current
// DC for printing
m_bPrinting = pDC-> m_bPrinting;
m_hDC = pDC-> m_hDC;
m_hAttribDC = pDC-> m_hAttribDC;
}

// Fill background
FillSolidRect(m_rect, pDC-> GetBkColor());
}

~CMemDC()
{
if (m_bMemDC) {
// Copy the offscreen bitmap onto the screen.
m_pDC-> BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);

//Swap back the original bitmap.
SelectObject(m_oldBitmap);
}
else {
// All we need to do is replace the DC with an illegal
// value, this keeps us from accidentally deleting the
// handles associated with the CDC that was passed to
// the constructor.
m_hDC = m_hAttribDC = NULL;
}
}

// Allow usage as a pointer
CMemDC* operator-> ()
{
return this;
}

// Allow usage as a pointer
operator CMemDC*()
{
return this;
}
};

#endif

❹ 用C语言写了一个贪吃蛇,求怎么利用双缓冲技术解决闪屏问题

人家说的双缓冲技术不是用于你这样的“黑窗口程序”的……
我没在黑窗口下做过游戏,所以不清楚你是怎么“将这些东西显示到屏幕上”的。但是我推测缓冲技术对于你的这个程序的问题没有效果。
3D游戏编程中的双缓冲技术指的是根据3D场景中摄像机的位置和角度,来生成一张“摄像机看到的图像”(也就是要显示到屏幕上的图像)时,生成的过程会有大量的计算,如果直接将“摄像机看到的图像”生成到屏幕上,那就会让观察者直接看着图像生成的过程,如果生成的速度很快那没问题,但显然得考虑到3D场景复杂、生成这张图像偏慢的情况,如果生成速度偏慢,那屏幕上就会看着图像从左到右或者从上到下一个个像素绘制出来的过程,这样的体验肯定很不好。所以我们先将图像“生成到一个缓冲区”,等图像生成完毕了,再将缓冲区里的完整的图像直接呈现到屏幕上,这样就可以避免“直接生成到屏幕上”导致的问题,而如果我们使用了两个缓冲区(将下一张图像和下下张图像分别“生成”到这两个缓冲区,然后顺序呈现到屏幕上),那就叫“双缓冲”,类似的有单缓冲和三缓冲。

如果不太理解“3D场景”,“摄像机”,“摄像机看到的画面”,请想象一下我们的世界就是一个“3D场景”,我们的眼睛就是“摄像机”,我们的眼睛看到的(投射到视网膜上的)就是“摄像机看到的画面”,我们就是玩家。
在类似CS这样的第一人称游戏中,我们的“摄像机”可以移动,去“观察”CS的“3D场景”。
在类似英雄联盟这样的“第三人称”游戏中,我们的“摄像机”是半固定的,我们只能以“上帝视角”去观察英雄联盟的“3D场景”

❺ 怎么在C/C++程序中运用双缓存,双线程的大规模数据处理方法

无语了,又是你。。。

缓存在程序里就是依据程序需要申请的一段程序空间,可以用数组,可以用队列,也可以用链表。你说的queue<>是STL提供的已经搭好框架的队列。
具体需要怎样的缓存要看你的程序需要。
我举个例子,假如我是HTTP服务器程序,每秒收到多个HTTP请求,我会用多进程(多进程比多线程稳定)或者多线程来处理各个请求,主进程等待HTTP服务端口来数据,每来一个请求就起一个线程去处理它。来的数据我就可以放在一个 queue<char*>的数据结构里,这个就是缓存了。每个线程我都传个指针给他,让线程自己去访问其中一个缓存,取出HTTP请求做分析。而队列中的其他缓存可以继续接受数据。

创建线程的方法对操作系统有一定的依赖,在windows上一般是用CreateThread以及其相关函数,你可以查MSDN得到更详细的信息,或者直接网络。在linux或者unix上,一般用folk来起进程,pthread线程库(例如pthread_create)来操作线程。不过也有不用线程技术,用select epoll等技术的。这些你可以自己查到相应的例子。

希望这些对你有帮助。

❻ C语言 双缓冲

双缓冲,就是在内存中创建一个与显示图形一样大小尺寸的画布,在这个画布上画图,待图形完全画完后将这个画布一次性输出显示,这样能有效避免闪烁问题。

❼ 求问如何在C/C++程序中运用双缓存双线程等大规模数据处理

线程技术主要是用来并行处理一些任务,这些任务之间一般少有逻辑顺序上的关联,所以用线程技术可以提高程序整体的运行速度,特别在其中一些子线程运行速度有很大差距的情况下。
fread不输入整块调入,它底层是使用的read之类的函数,对文件句柄进行操作。gets函数则是对指针指向的内存地址操作。这些都是上层逻辑了,离磁盘寄存器很远。真正加快文件读取速度的方法有很多,比如把整个文件映射到内存里,又比如跳过磁盘缓存直接大块读取内容。这些有的有专门的API函数可用,有的则需要你自己改写系统底层代码。
建议你多看看操作系统原理方面的书,可以去试着学习下linux内核代码和原理,这样你对这些问题就会有更深的认识。
希望这些建议能帮助你。

❽ 图像撕裂,掉帧以及二级缓存三级缓存的由来

图像撕裂是我们肉眼看到的一张图片上下发生错位,即断层,如下图:

其本质是拿到图像后,GPU进⾏渲染->帧缓存区⾥ ->视频控制器->读取帧缓存区信息(位图) -> 数模转化(数字信号处->模 拟型号) ->(逐⾏扫描)显示,当第一帧图像扫描到某个位置时,GPU拿到新的数据并存到帧缓冲区,这个时候视频控制器从帧缓冲区扫描的是新拿到的一帧的图像,最后就形成了在我们肉眼看到的断层现象,即我们看到的一张图片其本质是两张图片组合而来,究其原因就是视频控制器显示速度小于了GPU处理图形的速度

为了解决撕裂,苹果爸爸引入了: 垂直同步Vsync + 双缓存区 DoubleBuffering 

(1)垂直同步Vsync:帧缓存区加锁 防⽌出现撕裂情况 

(2)双缓存区 DoubleBuffering :就是GPU开辟AB两个帧缓冲区

执行流程就是当A帧缓冲区拿到第一帧数据,给A缓冲区加上一把锁,屏幕控制器从A拿到数据并逐行扫描完成,A帧缓冲区解锁,并且屏幕控制器指向B帧缓冲区,B帧缓冲区加锁并逐行扫描显示,在屏幕控制器扫描B帧缓冲区的时候,A帧缓冲区拿到GPU传过来的新一帧数据,以此类推,解决撕裂问题

在引入二级缓冲区机制后,出现了一个新的问题--->掉帧

特别说明:掉帧不是因为丢失了一帧的数据就叫掉帧!!!!!!!!!!!

每帧画面的处理时间大概在16.7ms(1s/60 ≈16.7ms),当超过这个时间就会出现掉帧,如上图:当接收接收Vsync ,由于cpu/gpu图⽚数据(速度大于了16.7ms) -> 拿不到FrameBuffer ->这个时候屏幕控制器只能显示同一帧的数据, 即: 掉帧(重复渲染同⼀帧数据)

为了减少掉帧 (注意不是解决,掉帧问题只能尽量的减少,而不是解决,三级缓冲区也有可能出现掉帧),引入三级缓存区, 三级缓冲区是为了充分利用CPU/GPU的空余时间,开辟ABC三个帧缓冲区,A显示屏幕, B也渲染好,C再从GPU拿取渲染数据,当屏幕缓冲区和帧缓冲区都弄好了,然后视频控制器再指向帧缓冲区的另外一个,再显示,这样交替,达到减少掉帧的情况,这样做就比二级缓冲区多了一个确认的操作

总结:屏幕卡顿原因: 

1. CPU/GPU 渲染流⽔线耗时过⻓->掉帧 

2. 垂直同步Vsync + 双缓存区 DoubleBuffering 以掉帧作为代价=>屏幕撕裂 

3. 三缓存区: 合理使⽤CPU/GPU 减少掉帧次数; 

❾ c/c++中~~以下代码是双缓存,但是我不想要双缓存,要怎样修改代码

HDChDc;
hDc=GetDC(NULL);
HBITMAPhBitMap;
hBitMap=CreateCompatibleBitmap(hDc,with,hight);
CImagemImage;
mImage.Attach(hBitMap);
mImage.Save(pthis->PicPath);

❿ 单缓冲和双缓冲 有什么区别

单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的闪烁。
双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。
一般用OpenGL绘图都是用双缓冲,单缓冲一般只用于显示单独的一副非动态的图像。

热点内容
传奇脚本刷怪 发布:2024-10-06 11:57:47 浏览:261
c语言输入小写输出大写 发布:2024-10-06 11:49:57 浏览:361
金立手机服务器异常是什么原因 发布:2024-10-06 11:49:48 浏览:699
python多线程假的 发布:2024-10-06 11:37:09 浏览:723
自己动手构造编译 发布:2024-10-06 11:35:11 浏览:550
c语言编译器win10 发布:2024-10-06 11:33:35 浏览:971
安卓手机里的自动备份是什么 发布:2024-10-06 11:30:16 浏览:714
想买电脑配置要注意哪些 发布:2024-10-06 11:21:50 浏览:541
滴滴云存储 发布:2024-10-06 11:17:37 浏览:767
精通android游戏开发 发布:2024-10-06 11:16:54 浏览:801