作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題Re: [問題] double buffer的問題
時間Wed Jan 13 13:30:05 2010
※ 引述《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)
→ ADF:當你呼叫InvalidateRect系統會傳WM_PAINT到指定視窗 01/13 14:32
→ ADF:這時候你就攔截 WM_PAINT 訊息 呼叫你要 render fun 01/13 14:33
→ ADF:另外如果InvalidateRect第三個參數設成 TRUE 01/13 14:34
→ ADF:系統還會在傳 WM_PAINT 前 先傳一個 WM_ERASEBACKGROUND 01/13 14:35
→ ADF:如果你沒有阻擋 ERASEBACKGROUND 系統預設是會畫 視窗所預設 01/13 14:37
→ ADF:的 background color 所以這大概是你畫面會閃爍的原因.. 01/13 14:38