Re: [問題] double buffer的問題

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2010/01/13 13:30), 編輯推噓0(006)
留言6則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《TeaEEE (愛不趴 不愛趴)》之銘言: : 真正造成閃爍的原因在於 當你呼叫重繪動作時 : 系統會把無效區中的所有的物件依序重繪 ^^^^ 為什麼說是系統呢@@ 不是應該我自己重劃嗎? 我自己要從底部畫到上部 : 以一個簡單的重繪bmp的例子 可能的動作有 : 1. 先呼叫FillRect將底色塗掉 這位大大 您講到這個我查了一下 是不是其實有WM_PAINT訊息必定會伴隨 WM_ERASEBKGND ? 手動呼叫invalidaterect(1,2,3這參數設true)就會有這訊息? 所以我要自己攔截這訊息 並且做一些事情 : 2. 呼叫BitBlt繪出bmp圖 : 你會看到的閃爍 是先看到底色 然後再看到bmp的現象 : 要解決這個問題 必需要讓DC實際上畫的動作只作一次才是解決之道 : 可以先建立一塊memDC : 將FillRect與BitBlt的動作[畫]到memDC上 : 然後再把memDC[畫]到視窗的DC上才能避免 恩以上我目前是這樣做 所以這就是double buffering了嗎? 另外想問一下 如果我有個連續的圖檔 模擬動畫 我想法是呼叫timer 並且一直呼叫invalidaterect 來播放連續圖片 這是可行之道嗎? 不過我之前嘗試過 發現 WM_PAINT 會比WM_TIMER的優先權來的高 如果我有別的TIMER再做別的事情 好像這時會被WM_PAINT給取代掉了 變成說他就不處理TIMER或是超過expired time很久才會去做 這是正常現象嗎? 謝謝 ps. 之前寫opengl程式其實都是用glut所以不太懂他怎麼一直重劃的 (以為是WM_PAINT再呼叫invalidaterect) 看了nehe後發現他是用peekmessage而不是用getmessage 要用peekmessage的時機到底是甚麼@@ 一般好像都是用get~ 是在做遊戲才會用peek嗎? thx~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222 ※ 編輯: QQ29 來自: 219.87.64.222 (01/13 13:40)

01/13 14:32, , 1F
當你呼叫InvalidateRect系統會傳WM_PAINT到指定視窗
01/13 14:32, 1F

01/13 14:33, , 2F
這時候你就攔截 WM_PAINT 訊息 呼叫你要 render fun
01/13 14:33, 2F

01/13 14:34, , 3F
另外如果InvalidateRect第三個參數設成 TRUE
01/13 14:34, 3F

01/13 14:35, , 4F
系統還會在傳 WM_PAINT 前 先傳一個 WM_ERASEBACKGROUND
01/13 14:35, 4F

01/13 14:37, , 5F
如果你沒有阻擋 ERASEBACKGROUND 系統預設是會畫 視窗所預設
01/13 14:37, 5F

01/13 14:38, , 6F
的 background color 所以這大概是你畫面會閃爍的原因..
01/13 14:38, 6F
文章代碼(AID): #1BJLfVkN (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BJLfVkN (C_and_CPP)