雙緩存技術
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對應著自己的繪圖區域圖形上下文