?? dx5.txt
字號:
二、DirectDraw的體系
多媒體軟件要求高性能的圖象。通過DirectDraw,Microsoft使得對圖象敏感性的程序在速度和效率上都比在GDI上有了大大是提高,
同時又保持了設備無關性,DirectDraw提供的工具能完成如下的關鍵任務:
.操作多個顯示表面
.直接存取視頻內存
.頁翻轉
.后臺緩沖
.調色板的管理
.剪切
另外,DirectDraw在運行時允許你查詢顯示硬件的性能然后提供顯示設備所能夠支持的最佳效能。
DirectDraw提供了基于COM的服務接口,使用最多的是IDirectDraw2、IDirectDrawSurface3、IDirectDrawPalette、IDirectDrawClipper和
IDirectDrawVideoPort。除了這些接口外,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對象表征了一些系統只具有的視頻端口硬件,該硬件允許直接訪問幀緩沖區而不需要訪問CPU或使用PCI總線。
你可以先指定IDDVideoPortContainer標志,再調用QueryInterface方法來創建 DirectDrawVideoPort對象。其它相關的方法可從接口
IDDVideoPortContainer和IDirectDrawVideoPort中獲得。
2、硬件抽象層HAL(Hardware Abstraction Layer)
DirectDraw通過硬件抽象層HAL提供了設備無關性。HAL是一種特殊的設備接口,由設備生產廠商提供。DirectDraw利用HAL直接
在顯示設備上工作。應用程序并不同HAL交互。設備制造廠商以Windows95下的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函數來處理表面對象。
三、DirectDraw的要素
DirectDraw中最基本的要素有協作等級、顯示模式、DirectDraw對象、表面、調色板、剪切板等,下面對各個要素逐一進行介紹。
1、協作等級(Cooperative Level)
協作等級描述了DirectDraw如何同顯示交互及對那些可能影響顯示的事件的反應。你可以使用IDirectDraw2::SetCooperativeLevel方法來
設置協作等級。在大多數的情況下,你可以使用協作等級來確定應用程序是否運行在獨占全屏模式或窗口模式。DirectDraw協作等級還具有
以下作用:
.使DirectDraw能夠使用X模式(Mode X)分辨率。
.如果用戶按了ctrl + alt + del,禁止DirectDraw釋放對顯示的獨占控制和重新啟動(僅在獨占模式下)。
.使DirectDraw能夠最大化和最小化以響應激活的事件。
標準的協作等級指明了DirectDraw程序是一個窗口應用程序。在這種情況下,你不能改變主表面的調色板和執行頁翻轉。另外,你還不
能調用那些對顯示或視頻內存影響程度大的方法,如 IDirectDraw2::Compact等。
在全屏獨占協作等級下,你可以使用硬件的所有性能,設置慣用調色板和動態調色板,改變顯示分辨率,緊湊內存和實現頁翻轉等。全屏獨
占模式不禁止其它的應用分配表面,也不禁止它們使用DirectDraw和GDI,但禁止其它發應用改變顯示分辨率和調色板。
因為應用程序可以在多窗口使用DirectDraw,所以當應用要求工作在DDSCL_NORMAL模式時,IDirectDraw2:: SetCooperativeLevel方
法并不需要一個指定的窗口句柄。將NULL傳遞給窗口句柄,所有的窗口都能同時工作在標準窗口模式下。
2、顯示模式(Display Modes)
顯示模式是對顯示硬件從主表面傳送給顯示器的圖象的大小和位深度(bit-depth)的描述。顯示模式可以刻畫為:寬、高和位深度。例
如,大多數的顯示適配器都能顯示寬640個像素,高480個像素,每個像素的顏色值為8位的數據圖象,該顯示模式就幾為640x480x256。
要想得到更大的分辨率或位深度,就需要更多的顯示內存。
顯示模式有兩種類型:調色模式和非調色模式。對于調色顯示模式,每一個像素都是一個指向相關調色板的索引值。顯示模式的位深度
決定了調色板中能夠具有的顏色的數目。例如,對于8位調色顯示模式,每一個像素都是一個從0到255的值。在這種顯示模式下,調色板
可以包含256中顏色。非調色顯示模式則不使用調色板,該模式下的位深度指明了用于描述一個像素的總的位數。
主表面和主翻轉鏈中的任何表面都應該和顯示模式的大小、位深度和像素格式匹配。
2.1、檢測所支持的顯示模式
因為顯示硬件的不同,并不是所有的設備都支持所有的顯示模式。要檢測系統所支持的顯示模式,需要調用
IDirectDraw2::EnumDisplayModes方法。通過設定適當的值和標志, IDirectDraw2::EnumDisplayModes方法可以列出所有支持的顯示模式,
也能判斷是否支持某一指定的顯示模式。
該方法的第一個參數dwFlags控制方法其它的選項,通常可以將dwFlags設為0來忽略其它的選項;第二個參數lpDDSurfaceDesc是用
以描述所給顯示模式的結構 DDSURFACEDESC的地址,一般將其設為NULL可以列出所有的模式。第三個參數lpContext是一個指針,
DirectDraw需要將該指針傳遞給回調函數,如果不需要在回調函數中有額外的數據,可將其設為NULL。最后一個參數是
lpEnumModesCallback,它是DirectDraw對于每一種支持的顯示模式調用的回調函數的地址。
在調用IDirectDraw2::EnumDisplayModes方法時提供的回調函數必須同EnumModesCallback函數的原型相匹配。對于硬件所支持的每一
種顯示模式,DirectDraw調用你的回調函數來傳遞兩個參數,第一個是DDSURFACEDESC結構的地址,該結構描述了一種支持的顯示模式;
第二個參數是調用IDirectDraw2::EnumDisplayModes時指定的應用定義的數據的地址。
通過檢查DDSURFACEDESC結構的值來得到它所描述的顯示模式,其中關鍵的成員是dwWidth、dwHeight、和ddpfPixelFormat。dwWidth
和dwHeight描述了顯示模式的大小;ddpfPixelFormat是一個DDPIXELFORMAT結構,它包含了有關位深度的信息。
DDPIXELFORMAT結構包含了描述顯示模式位深度的信息,并且說明該顯示模式是否使用調色板。如果dwFlags成員包含了
DDPF_PALETTEINDEXED1、DDPF_PALETTEINDEXED2、DDPF_PALETTEINDEXED4或DDPF_PALETTEINDEXED8標志,該顯示模式
的位深度就是1、2、4或8位,并且每個像素都是一個相公調色板的索引。如果dwFlags包含了DDPF_RGB標志,該顯示模式就是非調色
顯示模式,并且其位深度由DDPIXELFORMAT結構中的dwRGBBitCount成員提供。
2.2、設置顯示模式
你可以調用IDirectDraw2::SetDisplayMode方法來設置顯示模式。該方法接受四個參數來設置顯示模式的分辨率的大小、位深度和刷新
率。它使用第五個參數來指定給定模式的特殊選項,目前僅用于13模式和X模式320x200x8中。
你可以指定期望得到的顯示模式的位深度,但不能指定顯示硬件用于該位深度的像素格式。要檢測顯示硬件用于當前位深度的RGB位
屏蔽,可以在設置顯示模式后調用 IDirectDraw2::GetDisplayMode方法。如果當前顯示模式是非調色模式,你可以通過檢查dwRBitMask、
dwGBitMask和dwBBitMask中的值來獲得教正的紅、綠、藍顏色位。
你還可以通過多個應用來改變顯示模式,只要它們都共享同一個顯示卡。也可以改變位深度,只要應用程序能獨占式地訪問DirectDraw
對象,所有的DirectDrawSurface對象在顯示模式改變后都會釋放表面內存,所以在更改了顯示模式之后,必須使用 IDirectDrawSurface3::Restore
方法重新為對象分配表面內存。
2.3、恢復顯示模式
如果顯示模式是通過調用IDirectDraw2::SetDisplayMode方法(而不是 IDirectDraw::SetDisplayMode方法)完成的,你可以調用
IDirectDraw2::RestoreDisplayMode方法來恢復到原來的顯示模式。如果應用程序是獨占式的協作等級,當你將應用程序的協作等級設回標準
時,顯示模式就會自動恢復為原來的模式。如果使用了DirectDraw接口,你必須顯式地恢復顯示模式。
2.4、X模式和13模式
DirectDraw支持X模式和13模式兩類顯示模式。13模式是320x200,每個像素是8位的調色模式,其16進制BIOS模式號為13。模式
X是從標準的VGA 13模式衍生出來的混合模式,該模式允許使用256KB的顯示內存(13模式僅允許實用64KB的顯示內存)。
在Windows95下,DirectDraw對所有的顯示卡提供兩種X模式(320x200x8和320x240x8)。一些顯示卡也支持線性低分辨率模式,在
線性低分辨率默默上下,主表面能夠被鎖定也能直接訪問,這在X模式下是不允許的。
只要應用程序調用IDirectDraw2::SetCooperativeLevel方法時使用了 DDSCL_ALLOWMODEX,、DDSCL_FULLSCREEN和
DDSCL_EXCLUSIVE標志,X模式就可用。如果沒有指定 DDSCL_ALLOWMODEX標志, IDirectDraw2::EnumDisplayModes方法就不能
列出X模式,當請求X模式時,對IDirectDraw2::SetDisplayMode方法的調用就會失敗。
當應用程序在X模式時不能使用IDirectDrawSurface3::Lock或IDirectDrawSurface3::Blt方法鎖定主表面或向主表面塊寫數據,也不能在
主表面或屏幕DC的GDI使用 IDirectDrawSurface3::GetDC方法。X模式由DDSCAPS肩胛骨中的DDSCAPS_MODEX標志來指定,DDSCAPS
結構是調用IDirectDrawSurface3::GetCaps和IDirectDraw2::EnumDisplayModes方法返回的DDSURFACEDESC結構中的一部分。
2.5、高分辨率和真彩色
DirectDraw支持由顯示設備驅動程序支持的所有的屏幕分辨率和位深度。DirectDraw允許應用程序改變顯示模式到任一種計算機顯示
驅動程序支持的顯示模式,包括24位和32位(真彩色)模式。
DirectDraw也支持真彩色表面的HEL位塊傳輸。如果顯示設備驅動程序在這些分辨率下支持位塊傳輸,顯示內存──顯示內存的位塊
傳輸將使用硬件塊寫方式,否則將使用HEL來提高位塊傳輸的性能。
Windows95和NT允許你指定正在使用的顯示器的類型。DirectDraw檢查已知顯示模式的列表,如果DirectDraw檢測到要求的模式同
該顯示器不兼容,對 IDirectDraw2::SetDisplayMode方法的調用將會失敗。當你調用方法IDirectDraw2::EnumDisplayModes時,只有顯示器
支持的模式才會被列出來。
3、DirectDraw對象
DirectDraw對象是所有DirectDraw應用程序的核心,也是Direct3D應用程序的一個有機組成部分。DirectDraw對象是你創建的第一個
對象,通過該對象再創建其它相關對象。一般通過調用DirectDrawCreate函數來創建一個DirectDraw對象,該函數返回一個IDirectDraw接
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -