• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. 高性能Windows圖形開(kāi)發(fā)庫(kù)WinG

        • 相關(guān)推薦

        高性能Windows圖形開(kāi)發(fā)庫(kù)WinG

        摘 要 該文首先概述高性能Windows圖形開(kāi)發(fā)庫(kù)WinG,然后講解WinG的一些特點(diǎn)及充分發(fā)揮WinG性能所必須遵循的十條原則,最后舉例說(shuō)明其開(kāi)發(fā)方法

        一、概述
        在Windows下,由于其GDI設(shè)備無(wú)關(guān)性、窗口環(huán)境、缺乏通用圖形庫(kù)等限制影響了圖形速度。圖形速度慢成為選擇Windows作為游戲平臺(tái)的最大障礙。
        Windows 95在保留Windows的最大優(yōu)點(diǎn)—設(shè)備無(wú)關(guān)性的同時(shí),在Win32 API中新增一個(gè)32位調(diào)用CreateDIBSection,使得圖形速度得到很大提高。Microsoft公司意識(shí)到圖形速度對(duì)于高質(zhì)量軟件的重要性,提
        供了WinG(發(fā)音"Win Gee",其中"G"代表游戲(Game))圖形庫(kù)。
        WinG 是為Windows3.1、Windows for Workgroups 3.11、Windows95和Windows NT設(shè)計(jì)的一種優(yōu)化的高性能圖形庫(kù),運(yùn)行于386以上的處理器。WinG能在Windows環(huán)境中提供與DOS環(huán)境相當(dāng)?shù)挠螒驁D形性能。程序員可以直接將內(nèi)存中的設(shè)備無(wú)關(guān)位圖(DIB)傳送到屏幕,并且提供抖動(dòng)(halftoning)API,利用標(biāo)準(zhǔn)Microsoft抖動(dòng)調(diào)色板支持對(duì)真彩色的仿真。

        二、WinGDC和API
        WinG提供一種新型設(shè)備描述表WinGDC,其用法類似于其它設(shè)備描述表,不同的是,程序員可以獲取直接指向WinGDC繪圖面、BITMAPINFOHEADER和顏色表的指針,還可以創(chuàng)建和選擇新的繪圖面或修改現(xiàn)有繪圖面的顏色表。應(yīng)用程序可以創(chuàng)建一個(gè)WinGDC和創(chuàng)建一個(gè)或多個(gè)WinGBitmap用于繪圖。一旦當(dāng)前幀繪圖、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)色板管理器用于管理多個(gè)應(yīng)用程序?qū)ν粋(gè)系統(tǒng)調(diào)色板的使用請(qǐng)求。它給每個(gè)應(yīng)用程序分配一個(gè)虛擬256色的邏輯調(diào)色板,并在必要時(shí)將邏輯調(diào)色板中的顏色轉(zhuǎn)換為系統(tǒng)調(diào)色板中的顏色。
        所謂對(duì)等(Identify)調(diào)色板,就是一個(gè)與當(dāng)前系統(tǒng)調(diào)色板精確(1:1)匹配的邏輯調(diào)色板。它不需要進(jìn)行調(diào)色板轉(zhuǎn)換,因此將WinGDC傳送到屏幕上時(shí)使用對(duì)等調(diào)色板能大大提高傳送速度。
        抖動(dòng)調(diào)色板是一個(gè)對(duì)等調(diào)色板,其中包含的顏色是經(jīng)過(guò)精心挑選的,并進(jìn)行了優(yōu)化使得在8位設(shè)備上通過(guò)抖動(dòng)模擬真彩色。應(yīng)用程序可選取該調(diào)色板并在顯示設(shè)備描述表中實(shí)現(xiàn),以便利用WinG提供的抖動(dòng)技術(shù)。WinG圖形庫(kù)提供兩個(gè)支持抖動(dòng)的API:WinGCreateHalftonePalette和 WinGCreateHalftoneBrush,利用它們可在8位設(shè)備上仿真出24位真彩色。

        四、WinG的DIB方向

        1.自下而上DIB
        Windows DIB的標(biāo)準(zhǔn)類型是自下而上的DIB,即DIB總是指向內(nèi)存中最底層的掃描線。坐標(biāo)(0,0)對(duì)應(yīng)于圖像的左下角,而Windows將(0,0)對(duì)應(yīng)于顯示器和設(shè)備相關(guān)位圖(DDB)的左上角,即自下而上DIB的y軸被顛倒了。
        對(duì)于8位自下而上DIB,屏幕上像素(X,Y)在內(nèi)存中的地址計(jì)算如下:
        //計(jì)算每掃描線實(shí)際比特?cái)?shù) DibWidthBits = (UINT)lpBmiHe
        ader->biWidth * (UINT) lpBmiHeader->biBitCount
        //按32比特邊界對(duì)齊
        DibWidthBytes = ((DibWidthBits+31) & (~31)) / 8;
        pPixelXY = DibAddr + (DibHeight-1-Y)*DibWidthBytes + X;

        2.自上而下DIB
        其保存方向與大多數(shù)DIB相同,內(nèi)存中的第一掃描線對(duì)應(yīng)于圖像的第一行。此時(shí)BITMAPINFOHEADER結(jié)構(gòu)的成員biHeight為負(fù)值。
        對(duì)于8位自上而下DIB,屏幕上像素(X,Y)在內(nèi)存中的地址計(jì)算為:
        pPixelXY = DibAddr + Y*DibWidthBytes + X.

        五、充分發(fā)揮WinG性能方法
        為了最大限度地發(fā)揮Windows環(huán)境下的WinG的塊傳送性能,要求:
        ·取出單色圖形調(diào)試卡和拆接網(wǎng)絡(luò)連接器;
        ·保存WinGBitmap表面指針和BITMAPINFO;
        ·避免重復(fù)GDI調(diào)用;
        ·專用函數(shù)可能比GDI函數(shù)執(zhí)行速度快;
        ·對(duì)任何函數(shù)都要測(cè)試其執(zhí)行速度;
        ·不要縮放位圖;
        ·不要進(jìn)行塊傳遞;
        ·不要進(jìn)行剪切操作;
        ·使用對(duì)等調(diào)色板;
        ·使用推薦的DIB格式。

        六、應(yīng)用實(shí)例
        下面的例子講解如何利用WinG圖形庫(kù)在Windows95下顯示真彩色位圖(24位)。利用Visual C++ 2.0編程。首先創(chuàng)建項(xiàng)目文件wing32.mak,設(shè)置Link加wing32.lib庫(kù)。具體WinG圖形庫(kù)和本例子完整源程序可與作者聯(lián)系。
        首先選擇Tools|Options...菜單項(xiàng),再選擇Directories命令。在Show Directories for下拉框中選擇Include files,增加目錄c:\wing\include;選擇Library files,增加目錄c:\wing\lib;選擇Executable files,增加目錄c:\wing\bin。
        選擇Project|Settings...菜單項(xiàng),再選擇Link命令。在Object/L
        ibrary Modules編輯框中加入連接庫(kù)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,
        (BITMAPINFO far *)&Info,&pBits);
        WinGBitmap =
        SelectBitmap(WinGDC,WinGBitmap);
        HPALETTE OldPalette =
        ::SelectPalette(dc.m-hDC,hpalApp,FALSE);
        ::RealizePalette(dc.m-hDC);
        HPALETTE WinGPalette =
        WinGCreateHalftonePalette();
        HPALETTE OldWinGPalette =
        ::SelectPalette(WinGDC,WinGPalette,FALSE);
        ::RealizePalette(WinGDC);
        ::StretchDIBits(WinGDC,0,0,DibWidth(
        pCurrentDIB),DibHeight(pCurrentDIB),
        0,0,DibWidth(pCurrentDIB),DibHeight(
        pCurrentDIB),DibPtr(pCurrentDIB),
        DibInfo(pCurrentDIB),
        DIB-RGB-COLORS,SRCCOPY);
        ::SelectPalette(WinGDC,OldWinGPalette,FALSE);
        ::DeleteObject(WinGPalette);
        int Width = DibWidth(pCurrentDIB);
        int Height = DibHeight(pCurrentDIB);
        WinGStretchBlt(dc.m-hDC,0,0,Width,
        Height, WinGDC,0,0,
        DibWidth(pCurrentDIB),
        DibHeight(pCurrentDIB));
        ::SelectPalette(dc.m-hDC,OldPalette,FALSE);
        ::SelectPalette(WinGDC,OldPalette,FALSE);
        ::DeleteObject(SelectBitmap(WinGDC,WinGBitmap));
        ::DeleteDC(WinGDC);
        }
        注意,在Windows 95下執(zhí)行WinG安裝程序Setup.exe,然后就可執(zhí)行Wing32.exe。
        用Visual C++ 2.0編譯源程序,必須將WinG圖形庫(kù)Wing31.lib連接(link)到可執(zhí)行文件Wing32.exe中(見(jiàn)文中所述)。

        【高性能Windows圖形開(kāi)發(fā)庫(kù)WinG】相關(guān)文章:

        Windows 95的引導(dǎo)圖形界面及抖動(dòng)變色圖像的形成03-03

        解析幾何3D圖形庫(kù)和動(dòng)畫庫(kù)03-07

        AutoCAD中圖形庫(kù)的創(chuàng)建和管理03-18

        解析幾何3D圖形庫(kù)和動(dòng)畫庫(kù)軟件03-07

        Windows2000設(shè)備驅(qū)動(dòng)程序的研制開(kāi)發(fā)03-03

        基于Windows2000開(kāi)發(fā)WDM設(shè)備驅(qū)動(dòng)程序的方法03-19

        檔案編研選材數(shù)據(jù)庫(kù)的合理開(kāi)發(fā)03-20

        全國(guó)工程地質(zhì)專家?guī)煜到y(tǒng)的開(kāi)發(fā)03-01

        利用Delphi開(kāi)發(fā)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)應(yīng)用03-03

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 最新精品久久精品 | 久久精品少妇一级 | 亚洲欧美激情国产一区二区 | 亚洲欧美国产色婷婷 | 午夜性色福利在线视频观看 | 亚洲一二三级看视频香蕉 |