定義
DirectDraw為一個特殊的記憶體管理員,提供 2-D存取 Windows Graphics Device Interface (GDI)的硬體加速, 個人覺得定義最好的是下面這段DirectDraw is a low-level application programming interface (API) for graphics. It controls memory, the hardware blitter, and surface flipping operations. DirectDraw is a software interface that provides direct access to display devices while maintaining compatibility with the Windows Embedded CE graphics device interface (GDI).何時該用 DirectDraw? 主要是以效能考量的時候, 為了提升 GDI速度的不足。
DirectDraw主要任務:
- 直接存取影像記憶體(video meory), 而不是系統記憶體(system memory)
- Page flipping
- Back buffering
- Clipping
介面
- Graphics Devices
- 定義: The device context is a structure containing information about the device.
- DirectDraw Objects: IDirectDraw
- 互動介面: Cooperative Level
- 一個 DirectDraw application可區分為兩類, 一種是視窗式 (windowed), 另一種為全螢幕式 (full-screen或 exclusive), 最大的差別在前者無法實現 page flipping, 後者則能避免其他應用程式存取 surfaces與畫圖於 primary display之上。
- Display Mode
- Primary Surfaces給 monitor的硬體設定值
- 主要為 dimension與 depth, e.g. 800*600 pixels and 8-bit/pixel
- 分為兩種: palettized與 non-palettized, 調色盤每個顏色是對應到一個 index value
- 重要 WinCE特性:
- DirectDraw cannot change the display mode.
- 呼叫 IDirectDraw::EnumDisplayModes 可查看硬體支援的 Display mode
- Singleton for process
- 對於每個 process, directdraw 是 singleton的, 若已經存在 instance, 則 call DirectDrawCreate 仍會回原本那個 instance.
- DirectDraw Surfaces: IDirectDrawSurface
- 定義: The DirectDrawSurface object represents a surface that usually resides in the display memory, but can exist in system memory if display memory is exhausted or if it is explicitly requested.
- 所有 surfaces都由 DirectDraw object來 create
- Blt
- 從 source 的 surface貼到 destination
- Blt會自動 scale且支援內插 (interpolation)
- DirectDraw Clippers: IDirectDrawClipper
程式
初始化程式, 其實就宣告 DirectDraw, DirectDraw的 Surface而已, 注意 Caps代表的是 capabilities, 也就是此實作 HAL (Hardware Abstract Layer)的 chip廠提供哪些 DirectDraw的功能。#include <ddraw.h> HRESULT hr; IDirectDraw * pDD = NULL; IDirectDrawSurface * pDDSPrimary = NULL; DDSURFACEDESC ddsd; hr = DirectDrawCreate(NULL, &pDD, NULL); hr = pDD->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; hr = pDD->CreateSurface(&ddsd, &pDDSPrimary, NULL);
細節:
- HEL (Hardware Emulation Layer) 僅提供 8, 16, 24, 32 bpp(bit per pixel)的 Surfaces。為了避免混用 HAL, HEL反而使效能降低,建議若有使用到硬體不支援的功能時,另外建立 system memory的 Surfaces來實作 (參考: Software Emulation)
沒有留言:
張貼留言