學習directdraw的過程中,遇到了乙個小問題,而且還讓我花了很久時間去想原因, 下面直接上**。
#define screen_width 1024
#define screen_height 768
#define screen_bpp 8 //在我的機子上必須是8,要不畫面會很怪。
if (directdrawcreateex(null,(void**)&lpdd,iid_idirectdraw7,null)!= dd_ok)
if (lpdd->setcooperativelevel(getactivewindow(),ddscl_exclusive | ddscl_fullscreen | ddscl_allowmodex | ddscl_allowreboot) != dd_ok)
if (lpdd->setdisplaymode(screen_width,screen_height,screen_bpp,0,0) != dd_ok)
//initialize ddsu***ce description. initialize lpddprimary
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwsize=sizeof(ddsd);
ddsd.dwflags=ddsd_caps | ddsd_backbuffercount;
ddsd.dwbackbuffercount=1;
ddsd.dwwidth=screen_width;
ddsd.dwheight=screen_height;
ddsd.ddscaps.dwcaps=ddscaps_primarysu***ce | ddscaps_complex | ddscaps_flip;
if(lpdd->createsu***ce(&ddsd,&lpddprimary,null) != dd_ok) return false;
//initialize ddbuffer su***ce
ddsd.ddscaps.dwcaps=ddscaps_backbuffer;
if (failed(lpddprimary->getattachedsu***ce(&ddsd.ddscaps,&lpddbuffer))) return false;
以上是初始化的一些東西,懶得說,其實看函式名字就知道函式是搞撒的咯。
// initialize lpddbuffer memory. all of 0.
is
if (ddsd.lpitch == screen_width)
else
}while(failed(lpddprimary->flip(0,ddflip_wait)));
這一段**看起來也是沒問題的。其實也沒問題。 不過有乙個隱含的問題。 當你堅持lptich不等於螢幕寬度時,就有可能發生,也許是我的顯示卡太老咯。 如果你發現你繪製的螢幕畫面只繪製了一部分的時候 就要看看是不是這個問題了。 顯示卡不支援8位深度以上。
一般情況下是lptich是螢幕寬度的兩倍左右,這個情況下你把位深度調低,很大可能畫面就正常的,原因就是顯示卡不支援問題。
雙緩衝技術
理解 通常我們進行繪圖時,都是直接使用cdc cpaintdc等 物件在螢幕上繪製圖形,如我們經常在onpaint函式中使用 cpaintdc dc this dc.rectangle 0,0,100,100 在螢幕上繪製矩形。但如果應用需要頻繁的繪製圖形,比如每秒要在螢幕上繪製1000個矩形。因此...
2013 4 15 雙緩衝技術
主要原理 當乙個動畫爭先顯示時,程式有在改變他,前面還沒有顯示完,程式又請求重新繪製,這樣螢幕就會不停的閃爍。為了避免閃爍,可以用雙緩衝技術,將要哦處理的都在記憶體中處理好之後,再將其顯示到螢幕上。這樣顯示出來的總是完整的影象,不會出現閃爍的現象。核心技術 先通過setbitmap方法將要繪製哦所有...
Android 雙緩衝技術
有時候當我們的資料量過度的時候,這個時候如果我們頻繁的呼叫ondraw 方法就會導致畫面卡頓現象,閃屏現象,為了防止這種事情的發生,我們可以使用雙緩衝來載入資源顯示。雙緩衝技術例項 author b publicclasssu ceviewextendsviewimplementsrunnable ...