DirectDraw雙緩衝技術,乙個小問題。

2021-06-28 09:06:22 字數 1527 閱讀 4848

學習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 ...