當前位置:首頁 » 文件管理 » 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 14:03:32 瀏覽:635
所有程序都能反編譯嗎 發布:2024-10-06 13:48:39 瀏覽:605
城際快車源碼 發布:2024-10-06 13:28:10 瀏覽:132
什麼配置主機直播好 發布:2024-10-06 13:22:11 瀏覽:906
office緩存 發布:2024-10-06 13:20:03 瀏覽:540
我的世界國際版比較熱門的伺服器 發布:2024-10-06 13:04:10 瀏覽:534
8g緩存還剩多少怎麼看 發布:2024-10-06 12:59:52 瀏覽:232
物流公司怎麼配置電子面單 發布:2024-10-06 12:54:12 瀏覽:804
魔域歸來手游掛機腳本 發布:2024-10-06 12:42:54 瀏覽:352
福建伺服器雲空間 發布:2024-10-06 12:42:42 瀏覽:103