DirectDraw讀書筆記
DirectDraw對象
DirectDraw對象是DirectDraw應用程序的核心.它是你在建立DirectDraw應用程序時所要創建的第一個對象,再用它來創建所有其它相關的對象.通過調用DirectDrawCreate函數可以創建一個DirectDraw對象.DirectDraw 對象通過IDirectDraw(移動版本僅支持這個),IDirectDraw2,和IDirectDraw4接口為開發者提供其函數性.
DirectDrawSurface對象
DirectDrawSurface對象,通常簡稱為"頁麵(Surface)",代表了內存中的一塊區域,它存儲了可以顯示在顯示器上的圖象數據.通過調用DirectDraw對象的IDirectDraw4::CreateSurface函數可以創建一個與該DirectDraw對象相關聯的頁麵.DirectDrawSurface 對象通過IDirectDrawSurface(移動版本僅支持這個),IDirectDrawSurface2,IDirectDrawSurface3,和IDirectDrawSurface4接口為開發者提供其函數性.
DirectDrawSurface對象和DirectDraw對象什麼區別?DirectDraw對象,我們知道是表示整個顯示係統,也就是你的 顯卡和顯屏構成的那個係統,你能在顯示器屏幕上直接畫點東西嗎?不行,顯屏上的東西是通過顯存和內存操作把裏麵的東西顯示出來,那麼相對應於顯屏,內存中 就應該有一張矩形白紙供你作畫,然後才能把它在顯屏上顯示。那張白紙就是DirectDrawSurface對象,代表了顯存或內存裏的一個連續的線性的 數據區。這個數據區可以被代表顯示硬件的DirectDraw對象所識別和確認。一般,可以創建的頁麵有4種,我們常用的有主頁麵 (primary surface)和離屏頁麵(offscreen plain)先說主頁麵,就是一塊顯存,在主頁麵中的圖形會顯示到屏幕中,直接在主 頁麵上操作會有個問題,數據一多,圖象就會不連續,為此可以采用緩衝技術,即建立一個Back buffer(後台緩衝),說白了,就是在內存中再開辟一 塊區域,和主頁麵的區域對應,這樣就可以不直接操作主頁麵,先把數據寫入到這裏,然後通過換頁成為可見。離屏頁麵不同了,它是和主頁麵一模一樣的畫麵,但 是它永遠不在屏幕上表現出來,通常被用來存儲位圖,用於將後來的位圖圖象Blit到主頁麵或後台緩衝上。
DirectDrawPalette對象
DirectDrawPalette對象,通常簡稱為"調色板(Palette)",代表了一個可以為頁麵所使用的16或256色的調色板.它包含了一組RGB值的索引,用來描述頁麵上的像素所使用的顏色值.對於像素位深度大於8的頁麵,不需要使用調色板.通過調用IDirectDraw4::CreatePalette函數,可以創建一個DirectDrawPalette對象.DirectDrawPalette 對象通過IDirectDrawPalette接口為開發者提供其函數性.
DirectDrawClipper對象
DirectDrawClipper對象,通常簡稱為"裁剪器(Clipper)",幫助開發者使Blit(位塊傳送)操作限定在頁麵的某一區域內,或不超出頁麵的邊界範圍.通過調用IDirectDraw4::CreateClipper函數可以創建一個DirectDrawClipper對象.DirectDrawClipper 對象通過IDirectDrawClipper接口為開發者提供其函數性.
當硬件抽象層(HAL)不支持某種特性時,DirectDraw 會試圖進行軟件仿真.仿真的函數是由硬件仿真層(HEL)提供的.HEL 與HAL一樣,代表了DirectDraw的特性.很顯然,軟件仿真不能與硬件所提供的特性等效.可以調用IDirectDraw4::GetCaps函數以查詢硬件支持什麼特性.在應用程序初始化的時候檢查這些特性,你可以調整應用程序的參數以提供優化的性能.
下圖展示了DirectDraw,圖形設備接口(GDI),硬件抽象層(HAL)和硬件仿真層(HEL)四者之間的關係.
DirectDraw核心
這一部分討論DirectDraw的主要核心內容.相關信息被組織為如下幾組:
DirectDraw對象(The DirectDraw Object)
1.控製級描述了DirectDraw是怎樣與顯示設備相互作用的,它如何對係統事件產生反應.使用IDirectDraw4::SetCooperativeLevel函數可以設置DirectDraw的控製級.最主要的是,你使用DirectDraw控製級來決定你的應用程序是運行於全屏模式(具有獨占的訪問視頻內存的特性),還是運行於窗口模式.任何存在的頁麵都應該通過調用IDirectDrawSurface4::Restore或IDirectDraw4::RestoreAllSurfaces來恢複,這樣它們的內容將在顯示之前被重新裝載.
2.有兩種顯示模式:調色板式和非調色板式.對於調色板式顯示模式來說,每一個像素的顏色值是以一個相關調色板的索引值來代表.顯示模式的位深度決定了調色板中可容納的顏色數量.舉例來說,在8位的調色板顯示模式中,每一個像素的值從0到255,該調色板可容納256個顏色入口.非調色板式顯示模式,就象它的名稱所表示的那樣,不需要使用調色板.在這種顯示模式下,像素的位深度為16,24或32,每個像素分別占用2字節,3字節或4字節,用來描述像素的真實顏色.
3. DirectDraw 允許一個進程在需要的時候,可以任意多次的調用DirectDrawCreate函數.每次調用後,返回一個唯一的與設備無關的接口.每一個DirectDraw對象可以隨心所欲的使用,在對象與對象之間沒有相互依賴的關係.每個對象的行為就象它是由一個唯一的進程創建的.因為DirectDraw對象之間是不相互依賴的,由一個特定的DirectDraw對象創建的DirectDrawSurface, DirectDrawPalette 和DirectDrawClipper對象不應該與其它的DirectDraw對象一起使用,因為這些對象會在它的DirectDraw對象銷毀時而自動被釋放.如果它們與其它的DirectDraw對象一起使用,調用它們的函數將在它們被銷毀時退出.
4.DirectDrawSurface對象,代表了內存裏的一個連續的線性的數據區.這個數據區可以被代表顯示硬件的DirectDraw對象所識別和確認.DirectDrawSurface 對象代表了一個通常是駐留在顯存內的頁麵,如果顯存被用完或被明確地指定它也可以存在於係統內存裏.調用IDirectDraw::CreateSurface函數可以創建若幹類型的DirectDrawSurface對象,包括單頁麵對象,複雜頁麵(complex surface)-換頁鏈,或三維頁麵.CreateSurface 函數創建我們所請求的頁麵或換頁鏈,並且返回指向主頁麵(primary surface)的IDirectDrawSurface接口的指針.
主頁麵代表的是在顯示器的當前可見屏幕,它在頁麵描述中具有DDSCAPS_PRIMARYSURFACE標誌符.對於每一個DirectDraw對象來說,你隻可能擁有一個主頁麵.在移動版本中,僅支持一個後台緩衝頁麵,複雜頁麵(含有多個後台緩衝頁麵鏈)的形式是不被支持的。實現方式是這樣的,先創建一個主頁麵,然後在該主頁麵對象上調用EnumAttachedSurfaces()來綁定一個後台緩衝頁麵用於將來的flip操作。離屏頁麵(DDSCAPS_OFFSCREENPLAIN)通常被用來存儲位圖,用於以後將位圖圖象Blit到主頁麵或後台緩存上. (移動版本不支持)
DirectDraw裏的任何頁麵都可以構造為換頁頁麵(flipping surfaces).一個換頁頁麵是位於內存裏的任何一個可以在前台緩存(front buffer)和後台緩存(back buffer)之間交換的頁麵,這個換頁環境就是我們所稱的換頁鏈(flipping chain).在移動版本中,實際上隻存在兩個頁麵用於flipping操作。當你調用IDirectDrawSurface::Flip函數以請求一次換頁操作,指向主頁麵和後台緩存的指針相互交換(隻改變了頁麵的指針,數據並未實際移動).這就是說,換頁的操作,是通過交換顯示設備用來代表頁麵內存的指針,而不是通過相互複製頁麵的實際內存來完成的.(當顯存不足時情況就不同了)實際上每經曆一次flip操作以後主頁麵與後台緩存的頁麵指針都會互換,上一次刷新前的後台頁麵變成了新的主頁麵。隻要在每次update frame(用Timer實現)的循環調用中進行如下操作:1)後台頁麵對象->GetDC(&hdc)並更新內容 2)主頁麵調用flip()來顯示後台頁麵的更新結果,並把當前主頁麵變成後台頁麵等待下一次的更新操作。
附錄
常用DirectDraw接口
在通過DirectDrawCreate創建好DirectDraw對象實例以後,就可以通過調用合適的接口函數來管理他們,以下是一些主要的接口。
1.IDirectDraw
應用程序使用IDirectDraw接口的方法來創建DirectDraw的各種對象,並且與係統層變量一起工作。以下是一些該接口的常用函數參考。
控製級 |
|
|
|
創建對象 |
|
|
|
|
|
設備特性 |
2.IDirectDrawClipper
應用程序使用IDirectDrawClipper接口的函數來管理裁剪表(clip list)。以下是該接口的函數參考。
分配內存 |
|
裁剪表 |
|
|
|
|
|
|
|
窗口句柄 |
|
3.最後更新:2017-04-03 14:54:11