DIRECTDRAW7的性能研究(終結(jié)篇)_第1頁
DIRECTDRAW7的性能研究(終結(jié)篇)_第2頁
DIRECTDRAW7的性能研究(終結(jié)篇)_第3頁
DIRECTDRAW7的性能研究(終結(jié)篇)_第4頁
DIRECTDRAW7的性能研究(終結(jié)篇)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

DIRECTDRAW7—進(jìn)展史在說起DirectDraw7前,先對DirectX本身作個了解,DirectX是一種圖API有共性的東西,從內(nèi)部原理探討,也簡潔說來DirectX就是一系列的DLL〔動態(tài)連接庫,通過這些DLL,開發(fā)者可以在無視于設(shè)備差異的狀況下訪問底層的對它分為如下幾個局部:DirectDraw:為程序直接訪問顯存供給接口,同時和其它的Windows應(yīng)用程序保持兼容,這是Directx中格外重要的局部,它擔(dān)當(dāng)圖形處理的關(guān)鍵。mmx、3dnow、agp技術(shù),還能處理多屏幕顯示,讓窗口環(huán)境的玩耍更加多姿多采。Direct3D3D例如玩耍搖桿gamepad方向盤vr手套力反響的各種設(shè)備等以往要在Dos下用方向盤來玩賽車玩耍,就要先調(diào)整好 irq、dma等各種設(shè)置。而現(xiàn)在DirectInput則使這些設(shè)備與玩耍協(xié)作良好,不需要做特別配置。TCP/I、IPX進(jìn)展玩耍中的數(shù)據(jù)傳輸,這是為了滿足近來流行的網(wǎng)絡(luò)玩耍而開發(fā)的api,支持及保密措施。DirectSound:為訪問聲卡供給接口,支持WAV、MIDI這是用來處理聲音的api,除了播放聲音和處理混音之外,還加強(qiáng)了3d音效,DirectSound來解決的。DirectSound3D:通過此接口,可以模擬出某一個聲音在三維空間中任何一個位置的播放所產(chǎn)生的效果,從而到達(dá)逼真的圍繞立體聲。DirectMusic:此接口主要是生成一系列的原始聲音采樣反響給相應(yīng)的用戶大事。在DOS時代,用戶玩玩耍的時候,都必需確定所用聲卡的品牌,然后再設(shè)置APIDirectXDirectX件的任務(wù)就由DirectXWindowsDirectx是依照Directx這個標(biāo)準(zhǔn)來開發(fā)的,不管用戶使用什么品牌的顯卡、聲卡,什么WindowsDirectX件的,用戶使用的顯卡、聲卡的驅(qū)動程序也必需支持Directx。從這里看出,如眾多玩耍和硬件制造廠商共同更升級的的標(biāo)準(zhǔn),只要全部軟件硬件支持DirectX,那么它們就能進(jìn)展低端的會話,這里先回憶一下過去DirectXWindows操作系Windows3.1GUI越來越多的人開頭使用Window。不過,Windows3.1的聲音處理一次只能播放一Windows日益壯大的Windows家族,吸引了更多玩耍商家的留意,開頭開發(fā)基于同開發(fā)的標(biāo)準(zhǔn)平臺〔就是Direct,大家都遵循這個標(biāo)準(zhǔn),這樣做對誰來說都標(biāo)準(zhǔn)開發(fā)玩耍。也就是說,無論硬件是否支持某特別效果,只要DirectX標(biāo)準(zhǔn)中硬件依據(jù)DirectX件算出此效果,用戶就可以賞識到此效果。DirectXOpenGL它被用于圖形、影像效勞器,制作電影、QuakeIII就是基于這個標(biāo)準(zhǔn)的,而DirectX,很多硬件、主流玩耍都不支持它,沒有玩耍到表現(xiàn),但是它有微軟的支持推廣,它就有期望。DirectXDirectX1.0:為玩耍而生Windows3.1DirectXDirectXWindows95消滅了劃時代的變化,DirectXX2.0:2D3D這個時候標(biāo)志性的產(chǎn)物誕生了,2.0色戒備RedAlertDiabl〔恐驚WindowsDiable在DirectX的標(biāo)準(zhǔn)上開發(fā)的。惋惜的是,當(dāng)時很多老顯卡由于不能完全支持3DDOSVRDirect3D魅力還是可以感受到的。X3.0:D3DWindows95,DirectX3.0,DirectXD3DOpenGLGlide搏斗的士氣。從這個版本開頭,很多玩家知道了DirectX存在,也是這個時候開頭3D3DFXVoodoo,NvidiaRiva128,IntelI740。3DOpenGLD3D3DFXGlide3DFXGlide,3DFX,Glide3D3DFX固然看好3DFXNvidia3DFXGlide5.0:D3D4.0DirectX,DirectX3.03D系統(tǒng)的兼容性方面作了很大改善。6:D3DDirectX5.03D3DDirectX6.0NvidiaRivaTNT,并連的VooDoo2,VooDoo3。到了這個時代,市場格局已經(jīng)很清楚,是NVidia與3DFXDirectX63D323DPCIVOODOO800x60016Nvidia成功都為他奠定顯卡老大的根底。7:D3DDirectX7DirectX7T&L,3D3D玩耍中除了場景+物體還需要燈光,沒有燈光就沒有3D物體的表現(xiàn),無論是實時3D玩耍還是3D影像渲染,加上燈光的3D渲染是最消耗資源的。在T&L問世之前,這樣就可以把CPUCPUT&LDirectX7,即使沒有3DT&L第一塊個支持T&L功能的顯示卡是Nvidia的Geforce256,隨后公布的Geforce2Geforce256ATIRadeon7500T&LDirectX7的公布卻成了VOODOO3DFX嘆息。2023年微軟公布了DirectX8,一場顯卡革命開頭,它首次引入了“像素渲染”概念,同時具備像素渲染引擎〔PixelShader〕與頂點(diǎn)渲染引擎〔VertexShadeMadonion〔就是今日Futuremark〕DirectX83Dmark2023DirectX84DirectX8VS(VertexShader)PS(PixelShader)。通過vspsNVIDIAGeforce3,ATIRadeon8500。DirectX843DDirectX9.02023DirectX9.DirectX9PSVS2.0PixelShaderVertexShader首先,PS2.0具備完全可編程的架構(gòu),能對紋理效果即時演算、動態(tài)紋理PS1.46PS2.0160圖,可操作的指令數(shù)可以任意長,電影級別的顯示效果輕而易舉的實現(xiàn)。VS2.0通過增加Vertex程序的靈敏性,顯著的提高了老版本VS128256PC128程序設(shè)計師們更簡潔更輕松的制造出更秀麗的效果,讓程序員編程更簡潔。版本。二Directdraw7Directdraw1、DirectDraw7步驟二:設(shè)置屏幕的顯示方式和模式。步驟三:創(chuàng)立主外表和其他外表。步驟四:把子外表的數(shù)據(jù)處理后放到主外表上。2directdraw原來是:LPDIRECTDRAWlpDD;//DirectDrawlpDDSPrimary;//DirectDrawLPDIRECTDRAWSURFACElpDDSBack;//后臺緩沖外表DDSURFACEDESCddsd;//外表描述DDSCAPSddscaps;現(xiàn)在是:LPDIRECTDRAW7lpDD;//DirectDrawlpDDSPrimary;//DirectDrawLPDIRECTDRAWSURFACE7lpDDSBack;//后臺緩沖外表DDSURFACEDESC2ddsd;//外表描述DDSCAPS2ddscaps;而且聲明完外表描述后應(yīng)馬上用ZeroMemory(&ddsd,sizeof(ddsdZeroMemory(&ddscaps,sizeof(ddscaps));CreateSurface原來是:HRESULTWINAPIDirectDrawCreate(GUIDFAR*lpGUID,LPDIRECTDRAWFAR*lplpDD,IUnknownFAR*pUnkOuter);現(xiàn)在是:HRESULTWINAPIDirectDrawCreateEx(GUIDFAR*lpGUID,LPVOID*lplpDD,REFIIDiid,IUnknownFAR*pUnkOuter);其中iid參數(shù)必需設(shè)置為IID_IDirectDraw7。lpDDDirectDrawCreateEx(NULL,(void**)&lpDD,IID_IDirectDraw7,NULL);IdirectDraw7GUIDlinkdxguid.libDdraw.lib〔3〕設(shè)置顯示模式:不同是在SetDisplayMode函數(shù)原來有三個參數(shù),現(xiàn)在有五個,后兩個是:dwRefreshRateRefreshrateofthenewmode.Setthisvalueto0torequestthedefaultrefreshrateforthedriver.大意是:用于設(shè)置顯示時的刷頻率〔65MHZ75MHZ85MHZ0dwFlagsFlagsdescribingadditionaloptions.Currently,theonlyvalidflagisDDSDM_STANDARDVGAMODE,whichcausesthemethodtosetMode13insteadofModeX320x200x8mode.Ifyouaresettinganotherresolution,bitdepth,oraModeXmode,donotusethisflagandsettheparameterto0.如:if(lpDD->SetDisplayMode(640,480,8,0,0)!=DD_OK)returnFALSE;APIidirectdrawidirectdrawidirectdraw7,就目前的主流顯卡是支持的。#include<windows.h>#include<windowsx.h>#include<ddraw.h>//全局變量LPDIRECTDRAW7lpDD;//DirectDrawlpDDSPrimary;//DirectDrawLPDIRECTDRAWSURFACE7lpDDSBack;//后臺緩沖外表HDChdc;szMsg2[]=ESC“;BOOLbActive=TRUE;HWNDhwnd;函數(shù)聲明WinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);BOOLInitWindow(HINSTANCEhInstance,intnCmdShow);BOOLInitDDraw(void); //初始化DirectXvoidFreeDDraw(void); voidMainLoop(void);//玩耍主循環(huán)//-------------------------------------------------------//函數(shù):WinMain//功能:Win32//-------------------------------------------------------intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGmsg;//初始化主窗口if(!InitWindow(hInstance,nCmdShow))returnFALSE;DirectDrawif(!InitDDraw){DirectDraw“Error“,MB_OK);FreeDDraw;DestroyWindow(GetActiveWindow);returnFALSE;}while(1){if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ 消息就處理消息if(!GetMessage(&msg,NULL,0,0))returnmsg.wParam;TranslateMessage(&msg);DispatchMessage(&msg);}elseif(bActive){//假設(shè)程序處于激活狀態(tài),進(jìn)入玩耍主循環(huán)MainLoop;}//等待消息elseWaitMessage;}returnmsg.wParam;}//--------------------------------------//函數(shù):InitWindow//功能:創(chuàng)立主窗口//--------------------------------------staticBOOLInitWindow(HINSTANCEhInstance,intnCmdShow){//HWNDhwnd;//窗口句柄WNDCLASSwc//窗口類構(gòu)造wc.style=0;wc.lpfnWndProc=WinProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=LoadIcon(hInstance,IDI_APPLICATION);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wc.lpszMenuName=NULL;wc.lpszClassName=“dxHello“;//注冊窗口類RegisterClass&wc//創(chuàng)立主窗口hwnd=CreateWindowEx(0,“dxHello“,““,WS_POPUP,0, 0, GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);if(!hwnd)returnFALSE;ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);returnTRUE;}//--------------------------------------------------//函數(shù):WinProc//功能:處理主窗口消息//--------------------------------------------------WinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_ACTIVATEAPP:bActive=wParam;break;caseWM_KEYDOWN://擊鍵消息switch(wParam){caseVK_ESCAPE:PostMessage(hWnd,WM_CLOSE,0,0);break;}break;caseWM_SETCURSOR:SetCursor(NULL);returnTRUE;caseWM_DESTROY://退出消息FreeDDraw;PostQuitMessage(0);break;}//調(diào)用缺省消息處理過程returnDefWindowProc(hWnd,message,wParam,lParam);}//----------------------------------------------------------------//InitDDrawDirectDrawDirectDraw//設(shè)置顯示模式,創(chuàng)立主外表//----------------------------------------------------------------BOOLInitDDraw(void){DDSURFACEDESC2ddsd//外表描述DDSCAPS2ddscaps;//HDChdc;//設(shè)備環(huán)境句柄//DirectDrawif ( DirectDrawCreateEx(NULL, NULL)!=DD_OK)returnFALSE;if(lpDD->SetCooperativeLevel(GetActiveWindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)returnFALSE;//設(shè)置顯示模式if(lpDD->SetDisplayMode(640,480,8,0,0)!=DD_OK)returnFALSE;//填充主外表信息ZeroMemory(&ddsd,sizeof(ddsd));ZeroMemory(&ddscaps,sizeof(ddscaps));ddsd.dwSize=sizeof(ddsd);ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;ddsd.dwBackBufferCount=1;//創(chuàng)立主外表對象if(lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)!=DD_OK)returnFALSE;//提取后臺緩存外表指針ddscaps.dwCaps=DDSCAPS_BACKBUFFER;if ( lpDDSPrimary->GetAttachedSurface ( &lpDDSBack)!=DD_OK)returnFALSE;returnTRUE;}//-------------------------------------------------------//函數(shù):FreeDDrawDirectDraw//-------------------------------------------------------voidFreeDDraw(void){if(lpDD!=NULL){if(lpDDSPrimary!=NULL){lpDDSPrimary->Release;lpDDSPrimary=NULL;}lpDD->Release;lpDD=NULL;}}//-------------------------------------------------------函數(shù):MainLoop功能:玩耍主循環(huán)//-------------------------------------------------------voidMainLoop(void){staticinti=0;//后臺緩沖外表上的操作if(lpDDSBack->GetDC(&hdc)==DD_OK){SetBkColor(hdc,RGB(0+i,255-i,0+i));SetTextColor(hdc,RGB(0+i,0+i,255-i));TextOut(hdc,220,200,szMsg1,lstrlen(szMsg1));TextOut(hdc,280,220,szMsg2,lstrlen(szMsg2));lpDDSBack->ReleaseDC(hdc);i+=10;if(i>255)i=0;}if(lpDDSPrimary->Flip(NULL,0)!=DD_OK){ lpDDSPrimaryFreeDDraw; lpDDSBackPostQuitMessage(0); //把它掉到后臺進(jìn)展操作}}三DirectDraw7DirecrDraw下面分別對這兩個接口創(chuàng)立相應(yīng)的主外表,通過對顯存連續(xù)寫20幅1024x768(24DirectDraw72070ms。而190ms持舊版本的,我們目前用的DirectDrawDirectDirectDraw7。下面是兩者的分析數(shù)據(jù):(一)DirectDraw:20101。(1〔DirectDraw〕20102。2〔DirectDraw7〕〔三〕性能分析:2070ms,DirectDrawDirectDraw1.5這里主要是爭論了顯存和系統(tǒng)內(nèi)存的訪問速度。當(dāng)我們創(chuàng)立一個DirectDrawFlipBlt等就可以實現(xiàn),或者創(chuàng)立多個離屏的外表,預(yù)先把數(shù)據(jù)寫寫到后存或離屏外表上更快些?下面就兩方面分析:我們把后存外表或離屏外表創(chuàng)立在哪?顯存呢?還是系統(tǒng)內(nèi)存?分析:一般來說,我們的圖象數(shù)據(jù)是放在文件里,當(dāng)我們解碼后數(shù)據(jù)一般是3/4。3SetDisplayMode(1024,768,24);圖4 SetDisplayMode(1024,768,24);2-3ms,而系統(tǒng)外表到顯存外表和顯存間兩外表的時間可以無視不計。如何把數(shù)據(jù)寫到后存或離屏外表上更快些Win32GetDC;一個是直接寫。由于directX最大的好處就是可以直接寫數(shù)據(jù)到外表上,不用CPU析。分析:使用Win32的函數(shù)如GetDCGetDC獵取設(shè)備上下文DC〔DeviceContexWin32GDIGDIWindows序可以向外表寫數(shù)據(jù)。但GDIGDI應(yīng)用程序則顯得太慢了。Lock函數(shù),可以得到系統(tǒng)安排給外表5/6/7/8/9。5678Win32GetDC9用以得到圖象的數(shù)據(jù),固然LoadImage函數(shù)了。留意:假設(shè)想把外表創(chuàng)立在系統(tǒng)內(nèi)存里,那么在外表屬性設(shè)置時要置dwCaps=DDSCAPS_SYSTEMMEMORYdwCaps=DDSCAPS_VIDEOMEMORY。Lock、Unlock、GetDC、ReleaseDC。五DIRECTDRAW就我們開發(fā)中心板卡用到的DirectDraw接口,進(jìn)呈現(xiàn)狀和前景的淺分析。當(dāng)前我們所用到的DirectDr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論