DirectX5.0最新遊戲程式設計指南 DirectDraw篇 二、DirectDraw的體系 (轉)

worldblog發表於2007-12-04
DirectX5.0最新遊戲程式設計指南 DirectDraw篇 二、DirectDraw的體系 (轉)[@more@]

二、DirectDraw的體系
  多要求高的圖象。透過DirectDraw,使得對圖象敏感性的在速度和上都比在GDI上有了大大是提高,同時又保持了裝置無關性,DirectDraw提供的工具能完成如下的關鍵任務:
 .操作多個顯示錶面
 .直接存取影片
 .頁翻轉
 .後臺緩衝
 .調色盤的管理
 .剪下
另外,DirectDraw在執行時允許你查詢顯示的效能然後提供顯示裝置所能夠支援的最佳效能。
  DirectDraw提供了基於COM的服務介面,使用最多的是IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和IDirectDrawVoPort。除了這些介面外,DirectDraw繼續支援以前版本的介面。
  DirectDraw表徵了顯示介面卡,透過IDirectDraw和IDirectDraw2介面揭示其方法。在大多數情況下,你可以使用DirectDrawCreate來建立一個DirectDraw物件,也可以使用COM函式CoCreateInstance。
建立了DirectDraw物件後,你可以IDirectDraw2::CreateSurface方法為該物件建立表面。表面表徵了顯示硬體上的記憶體,既可以是影片記憶體,也可以是記憶體。DirectDraw透過其它的介面擴充套件了對調色盤、剪下及影片埠的支援。

1、DirectDraw的物件型別
  DirectDraw物件既可以是一個單獨的物件,也可以是幾個物件的組合。最新版本的DirectDraw有以下型別的物件:
1.1、DirectDraw物件
  DirectDraw物件是DirectDraw應用程式的核心,它是你建立的第一個物件。建立了DirectDraw物件後,可以在它的基礎上建立其它所有相關的物件。建立DirectDraw物件的函式是DirectDrawCreate。
1.2、DirectDrawSurface物件
  DirectDrawSurface物件表徵了一塊記憶體區域,在該區域的資料將作為圖象顯示在螢幕上或移動到其它表面上。建立DirectDrawSurface物件的方法是 IDirectDraw2::CreateSurface,其它相關的方法可透過介面 IDirectDrawSurface, IDirectDrawSurface2和IDirectDrawSurface3得到。
1.3、DirectDrawPalette物件
  DirectDrawPalette物件(有時也指的是“palette”)表徵了一個用於表面的16色或256色的調色盤,它包含了一系列描述同表面相關的RGB顏色索引值。建立DirectDrawPalette物件的方法是IDirectDraw2::CreatePalette。可以從介面IDirectDrawPalette獲取其它的方法。
1.4、DirectDrawClipper物件
  DirectDrawClipper物件(有時指的是“clipper”)幫助你禁止向表面的某一位置或超出表面的位置塊寫資料,建立DirectDrawClipper的方法是 IDirectDraw2::CreateClipper,其它相關的方法可從介面 IDirectDrawClipper中獲取。
1.5、DirectDrawVideoPort物件
  DirectDrawVideoPort物件表徵了一些系統只具有的影片埠硬體,該硬體允許直接訪問幀緩衝區而不需要訪問或使用PCI匯流排。
你可以先指定IDDVideoPortContainer標誌,再呼叫QueryInterface方法來建立 DirectDrawVideoPort物件。其它相關的方法可從介面IDDVideoPortContainer和IDirectDrawVideoPort中獲得。

2、硬體抽象層HAL(Hardware Abstraction Layer)
  DirectDraw透過硬體抽象層HAL提供了裝置無關性。HAL是一種特殊的裝置介面,由裝置生產廠商提供。DirectDraw利用HAL直接在顯示裝置上工作。應用程式並不同HAL互動。裝置製造廠商以95下的16位或32位程式碼的形式提供HAL,在WindowsNT下,
HAL是32位程式碼。HAL可以是顯示程式的一部分,也可以是透過製造商定義的私有介面同顯示驅動程式通訊的動態連結庫DLL。
DirectDraw HAL由、板卡或OEM(Original Equipment Manufacturer)提供。HAL只提供了裝置相關性程式碼,時沒有模擬。如果一種功能不被硬體支援,HAL將不把該功能作為硬體效能的一部分處理。另外,HAL不對引數進行證實,DirectDraw會在呼叫HAL之前完成引數的證實工作。

3、軟體模擬(Software Emulation)
  當硬體HAL不支援某一特性時,DirectDraw就嘗試用軟體來模擬這一特性。該模擬功能是由硬體模擬層HEL(Hardware-Emulation Layer)提供的。顯然,軟體模擬並不等同於硬體本身具有的特性。你可以用IDirectDraw2::GetCaps方法來查詢硬體所支援的特性。
  有時,硬體固有的特性和軟體模擬二者的結合比單獨使用軟體模擬的速度還要慢。例如,如果顯示裝置驅動程式支援DirectDraw但不支援拉伸塊寫方式,當從影片記憶體表面拉伸或位塊傳輸時就會產生效能上的損失。因為影片記憶體通常比系統記憶體的速度要慢,在訪問影片記憶體時CPU必須要等待。因此,如果你的應用程式使用了硬體未能提供的特性,最好在系統記憶體中建立表面,以避免CPU訪問影片記憶體時出現的效能損失情況。

4、系統組成(System Integration)
  下圖顯示了DirectDraw、圖形裝置介面GDI、硬體抽象層HAL、硬體模擬層HEL和硬體之間的關係。
 
如圖中所示,一個DirectDraw物件同GDI是並列關係,兩者都透過裝置相關抽象層訪問硬體。同GDI不同的是,DirectDraw只要有可能就會充分利用硬體提供的特有功能。如果硬體不支援某一特性,DirectDraw還會嘗試用HEL來模擬。DirectDraw也能以裝置上下文(Device Context)的形式提供表面記憶體,是你能夠使用GDI函式來處理表面物件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987897/,如需轉載,請註明出處,否則將追究法律責任。

相關文章