高性能Windows圖形開發(fā)庫WinG
高性能Windows圖形開發(fā)庫WinG
摘 要 該文首先概述高性能Windows圖形開發(fā)庫WinG,然后講解WinG的一些特點及充分發(fā)揮WinG性能所必須遵循的十條原則,最后舉例說明其開發(fā)方法。
一、概述
在Windows下,由于其GDI設(shè)備無關(guān)性、窗口環(huán)境、缺乏通用圖形庫等限制影響了圖形速度。圖形速度慢成為選擇Windows作為游戲平臺的最大障礙。
Windows 95在保留Windows的最大優(yōu)點—設(shè)備無關(guān)性的同時,在Win32 API中新增一個32位調(diào)用CreateDIBSection,使得圖形速度得到很大提高。Microsoft公司意識到圖形速度對于高質(zhì)量軟件的重要性,提
供了WinG(發(fā)音"Win Gee",其中"G"代表游戲(Game))圖形庫。
WinG 是為Windows3.1、Windows for Workgroups 3.11、Windows95和Windows NT設(shè)計的一種優(yōu)化的高性能圖形庫,運行于386以上的處理器。WinG能在Windows環(huán)境中提供與DOS環(huán)境相當?shù)挠螒驁D形性能。程序員可以直接將內(nèi)存中的設(shè)備無關(guān)位圖(DIB)傳送到屏幕,并且提供抖動(halftoning)API,利用標準Microsoft抖動調(diào)色板支持對真彩色的仿真。
二、WinGDC和API
WinG提供一種新型設(shè)備描述表WinGDC,其用法類似于其它設(shè)備描述表,不同的是,程序員可以獲取直接指向WinGDC繪圖面、BITMAPINFOHEADER和顏色表的指針,還可以創(chuàng)建和選擇新的.繪圖面或修改現(xiàn)有繪圖面的顏色表。應用程序可以創(chuàng)建一個WinGDC和創(chuàng)建一個或多個WinGBitmap用于繪圖。一旦當前幀繪圖、DIB組織、Sprite(精靈)組織完成后,就可將WinGDC緩沖區(qū)拷貝到屏幕。這種雙緩沖區(qū)結(jié)構(gòu)減少了閃爍,使屏幕更新更平滑。
WinG API包含如附表所示的函數(shù)和類型。
附表
WinGDC不是調(diào)色板設(shè)備,是RGB設(shè)備。使用WinGSetDIBColorTable,而不是SelectPalette修改設(shè)備的顏色表。
三、WinG調(diào)色板管理
Windows調(diào)色板管理器用于管理多個應用程序?qū)ν粋系統(tǒng)調(diào)色板的使用請求。它給每個應用程序分配一個虛擬256色的邏輯調(diào)色板,并在必要時將邏輯調(diào)色板中的顏色轉(zhuǎn)換為系統(tǒng)調(diào)色板中的顏色。
所謂對等(Identify)調(diào)色板,就是一個與當前系統(tǒng)調(diào)色板精確(1:1)匹配的邏輯調(diào)色板。它不需要進行調(diào)色板轉(zhuǎn)換,因此將WinGDC傳送到屏幕上時使用對等調(diào)色板能大大提高傳送速度。
抖動調(diào)色板是一個對等調(diào)色板,其中包含的顏色是經(jīng)過精心挑選的,并進行了優(yōu)化使得在8位設(shè)備上通過抖動模擬真彩色。應用程序可選取該調(diào)色板并在顯示設(shè)備描述表中實現(xiàn),以便利用WinG提供的抖動技術(shù)。WinG圖形庫提供兩個支持抖動的API:WinGCreateHalftonePalette和 WinGCreateHalftoneBrush,利用它們可在8位設(shè)備上仿真出24位真彩色。
四、WinG的DIB方向
1.自下而上DIB
Windows DIB的標準類型是自下而上的DIB,即DIB總是指向內(nèi)存中最底層的掃描線。坐標(0,0)對應于圖像的左下角,而Windows將(0,0)對應于顯示器和設(shè)備相關(guān)位圖(DDB)的左上角,即自下而上DIB的y軸被顛倒了。
對于8位自下而上DIB,屏幕上像素(X,Y)在內(nèi)存中的地址計算如下:
//計算每掃描線實際比特數(shù) DibWidthBits = (UINT)lpBmiHe
ader->biWidth * (UINT) lpBmiHeader->biBitCount
//按32比特邊界對齊
DibWidthBytes = ((DibWidthBits+31) & (~31)) / 8;
pPixelXY = DibAddr + (DibHeight-1-Y)*DibWidthBytes + X;
2.自上而下DIB
其保存方向與大多數(shù)DIB相同,內(nèi)存中的第一掃描線對應于圖像的第一行。此時BITMAPINFOHEADER結(jié)構(gòu)的成員biHeight為負值。
對于8位自上而下DIB,屏幕上像素(X,Y)在內(nèi)存中的地址計算為:
pPixelXY = DibAddr + Y*DibWidthBytes + X.
五、充分發(fā)揮WinG性能方法
為了最大限度地發(fā)揮Windows環(huán)境下的WinG的塊傳送性能,要求:
·取出單色圖形調(diào)試卡和拆接網(wǎng)絡(luò)連接器;
·保存WinGBitmap表面指針和BITMAPINFO;
·避免重復GDI調(diào)用;
·專用函數(shù)可能比GDI函數(shù)執(zhí)行速度快;
·對任何函數(shù)都要測試其執(zhí)行速度;
·不要縮放位圖;
·不要進行塊傳遞;
·不要進行剪切操作;
·使用對等調(diào)色板;
·使用推薦的DIB格式。
六、應用實例
下面的例子講解如何利用WinG圖形庫在Windows95下顯示真彩色位圖(24位)。利用Visual C++ 2.0編程。首先創(chuàng)建項目文件wing32.mak,設(shè)置Link加wing32.lib庫。具體WinG圖形庫和本例子完整源程序可與作者聯(lián)系。
首先選擇Tools|Options...菜單項,再選擇Directories命令。在Show Directories for下拉框中選擇Include files,增加目錄c:winginclude;選擇Library files,增加目錄c:winglib;選擇Executable files,增加目錄c:wingbin。
選擇Project|Settings...菜單項,再選擇Link命令。在Object/L
ibrary Modules編輯框中加入連接庫wing32.lib。
struct{
BITMAPINFOHEADER Header;
RGBQUAD aColors[256];
} Info;
CWing32View::CWing32View()
{
Info.Header.biSize =
sizeof(BITMAPINFOHEADER);
Info.Header.biWidth = 176;
Info.Header.biHeight = 144;
Info.Header.biPlanes = 1L;
Info.Header.biBitCount = 24L;
Info.Header.biCompression = 0L;
Info.Header.biSizeImage =
(long)(176L*144L*3L);
Info.Header.biXPelsPerMeter = 0;
Info.Header.biYPelsPerMeter = 0;
Info.Header.biClrUsed = 0;
Info.Header.biClrImportant = 0;
hBitsSrc = ::GlobalAlloc(GHND,
(long)(176L*144L*3L));
pBitsSrc =
(LPSTR)::GlobalLock(hBitsSrc);
}
CWing32View::~CWing32View()
{
::GlobalUnlock( hBitsSrc );
::GlobalFree( hBitsSrc );
}
void CWing32View::OnPaint()
{
CPaintDC dc(this);
void far *pBits;
hpalApp = WinGCreateHalftonePalette();
PDIB pCurrentDIB =
DibOpenFile("miss256.bmp");
HDC WinGDC = WinGCreateDC();
Info.Header.biSize =
sizeof(BITMAPINFOHEADER);
Info.Header.biWidth =
DibWidth(pCurrentDIB);
Info.Header.biHeight =
DibHeight(pCurrentDIB);
HBITMAP WinGBitmap =
WinGCreateBitmap(WinGDC,
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 yyfangchan@163.com (舉報時請帶上具體的網(wǎng)址) 舉報,一經(jīng)查實,本站將立刻刪除