DIRECTDRAW7的性能研究(终结篇)_第1页
DIRECTDRAW7的性能研究(终结篇)_第2页
DIRECTDRAW7的性能研究(终结篇)_第3页
DIRECTDRAW7的性能研究(终结篇)_第4页
DIRECTDRAW7的性能研究(终结篇)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DIRECTDRAW7—进展史在说起DirectDraw7前,先对DirectX本身作个了解,DirectX是一种图API有共性的东西,从内部原理探讨,也简洁说来DirectX就是一系列的DLL〔动态连接库,通过这些DLL,开发者可以在无视于设备差异的状况下访问底层的对它分为如下几个局部:DirectDraw:为程序直接访问显存供给接口,同时和其它的Windows应用程序保持兼容,这是Directx中格外重要的局部,它担当图形处理的关键。mmx、3dnow、agp技术,还能处理多屏幕显示,让窗口环境的玩耍更加多姿多采。Direct3D3D例如玩耍摇杆gamepad方向盘vr手套力反响的各种设备等以往要在Dos下用方向盘来玩赛车玩耍,就要先调整好 irq、dma等各种设置。而现在DirectInput则使这些设备与玩耍协作良好,不需要做特别配置。TCP/I、IPX进展玩耍中的数据传输,这是为了满足近来流行的网络玩耍而开发的api,支持及保密措施。DirectSound:为访问声卡供给接口,支持WAV、MIDI这是用来处理声音的api,除了播放声音和处理混音之外,还加强了3d音效,DirectSound来解决的。DirectSound3D:通过此接口,可以模拟出某一个声音在三维空间中任何一个位置的播放所产生的效果,从而到达逼真的围绕立体声。DirectMusic:此接口主要是生成一系列的原始声音采样反响给相应的用户大事。在DOS时代,用户玩玩耍的时候,都必需确定所用声卡的品牌,然后再设置APIDirectXDirectX件的任务就由DirectXWindowsDirectx是依照Directx这个标准来开发的,不管用户使用什么品牌的显卡、声卡,什么WindowsDirectX件的,用户使用的显卡、声卡的驱动程序也必需支持Directx。从这里看出,如众多玩耍和硬件制造厂商共同更升级的的标准,只要全部软件硬件支持DirectX,那么它们就能进展低端的会话,这里先回忆一下过去DirectXWindows操作系Windows3.1GUI越來越多的人开头使用Window。不过,Windows3.1的声音处理一次只能播放一Windows日益壮大的Windows家族,吸引了更多玩耍商家的留意,开头开发基于同开发的标准平台〔就是Direct,大家都遵循这个标准,这样做对谁来说都标准开发玩耍。也就是说,无论硬件是否支持某特别效果,只要DirectX标准中硬件依据DirectX件算出此效果,用户就可以赏识到此效果。DirectXOpenGL它被用于图形、影像效劳器,制作电影、QuakeIII就是基于这个标准的,而DirectX,很多硬件、主流玩耍都不支持它,没有玩耍到表现,但是它有微软的支持推广,它就有期望。DirectXDirectX1.0:为玩耍而生Windows3.1DirectXDirectXWindows95消灭了划时代的变化,DirectXX2.0:2D3D这个时候标志性的产物诞生了,2.0色戒备RedAlertDiabl〔恐惊WindowsDiable在DirectX的标准上开发的。惋惜的是,当时很多老显卡由于不能完全支持3DDOSVRDirect3D魅力还是可以感受到的。X3.0:D3DWindows95,DirectX3.0,DirectXD3DOpenGLGlide搏斗的士气。从这个版本开头,很多玩家知道了DirectX存在,也是这个时候开头3D3DFXVoodoo,NvidiaRiva128,IntelI740。3DOpenGLD3D3DFXGlide3DFXGlide,3DFX,Glide3D3DFX固然看好3DFXNvidia3DFXGlide5.0:D3D4.0DirectX,DirectX3.03D系统的兼容性方面作了很大改善。6:D3DDirectX5.03D3DDirectX6.0NvidiaRivaTNT,并连的VooDoo2,VooDoo3。到了这个时代,市场格局已经很清楚,是NVidia与3DFXDirectX63D323DPCIVOODOO800x60016Nvidia成功都为他奠定显卡老大的根底。7:D3DDirectX7DirectX7T&L,3D3D玩耍中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D玩耍还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。在T&L问世之前,这样就可以把CPUCPUT&LDirectX7,即使没有3DT&L第一块个支持T&L功能的显示卡是Nvidia的Geforce256,随后公布的Geforce2Geforce256ATIRadeon7500T&LDirectX7的公布却成了VOODOO3DFX叹息。2023年微软公布了DirectX8,一场显卡革命开头,它首次引入了“像素渲染”概念,同时具备像素渲染引擎〔PixelShader〕与顶点渲染引擎〔VertexShadeMadonion〔就是今日Futuremark〕DirectX83Dmark2023DirectX84DirectX8VS(VertexShader)PS(PixelShader)。通过vspsNVIDIAGeforce3,ATIRadeon8500。DirectX843DDirectX9.02023DirectX9.DirectX9PSVS2.0PixelShaderVertexShader首先,PS2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理PS1.46PS2.0160图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。VS2.0通过增加Vertex程序的灵敏性,显著的提高了老版本VS128256PC128程序设计师们更简洁更轻松的制造出更秀丽的效果,让程序员编程更简洁。版本。二Directdraw7Directdraw1、DirectDraw7步骤二:设置屏幕的显示方式和模式。步骤三:创立主外表和其他外表。步骤四:把子外表的数据处理后放到主外表上。2directdraw原来是:LPDIRECTDRAWlpDD;//DirectDrawlpDDSPrimary;//DirectDrawLPDIRECTDRAWSURFACElpDDSBack;//后台缓冲外表DDSURFACEDESCddsd;//外表描述DDSCAPSddscaps;现在是:LPDIRECTDRAW7lpDD;//DirectDrawlpDDSPrimary;//DirectDrawLPDIRECTDRAWSURFACE7lpDDSBack;//后台缓冲外表DDSURFACEDESC2ddsd;//外表描述DDSCAPS2ddscaps;而且声明完外表描述后应马上用ZeroMemory(&ddsd,sizeof(ddsdZeroMemory(&ddscaps,sizeof(ddscaps));CreateSurface原来是:HRESULTWINAPIDirectDrawCreate(GUIDFAR*lpGUID,LPDIRECTDRAWFAR*lplpDD,IUnknownFAR*pUnkOuter);现在是:HRESULTWINAPIDirectDrawCreateEx(GUIDFAR*lpGUID,LPVOID*lplpDD,REFIIDiid,IUnknownFAR*pUnkOuter);其中iid参数必需设置为IID_IDirectDraw7。lpDDDirectDrawCreateEx(NULL,(void**)&lpDD,IID_IDirectDraw7,NULL);IdirectDraw7GUIDlinkdxguid.libDdraw.lib〔3〕设置显示模式:不同是在SetDisplayMode函数原来有三个参数,现在有五个,后两个是:dwRefreshRateRefreshrateofthenewmode.Setthisvalueto0torequestthedefaultrefreshrateforthedriver.大意是:用于设置显示时的刷频率〔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;函数声明WinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);BOOLInitWindow(HINSTANCEhInstance,intnCmdShow);BOOLInitDDraw(void); //初始化DirectXvoidFreeDDraw(void); voidMainLoop(void);//玩耍主循环//-------------------------------------------------------//函数: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){//假设程序处于激活状态,进入玩耍主循环MainLoop;}//等待消息elseWaitMessage;}returnmsg.wParam;}//--------------------------------------//函数:InitWindow//功能:创立主窗口//--------------------------------------staticBOOLInitWindow(HINSTANCEhInstance,intnCmdShow){//HWNDhwnd;//窗口句柄WNDCLASSwc//窗口类构造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//创立主窗口hwnd=CreateWindowEx(0,“dxHello“,““,WS_POPUP,0, 0, GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);if(!hwnd)returnFALSE;ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);returnTRUE;}//--------------------------------------------------//函数: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;}//调用缺省消息处理过程returnDefWindowProc(hWnd,message,wParam,lParam);}//----------------------------------------------------------------//InitDDrawDirectDrawDirectDraw//设置显示模式,创立主外表//----------------------------------------------------------------BOOLInitDDraw(void){DDSURFACEDESC2ddsd//外表描述DDSCAPS2ddscaps;//HDChdc;//设备环境句柄//DirectDrawif ( DirectDrawCreateEx(NULL, NULL)!=DD_OK)returnFALSE;if(lpDD->SetCooperativeLevel(GetActiveWindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)returnFALSE;//设置显示模式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;//创立主外表对象if(lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)!=DD_OK)returnFALSE;//提取后台缓存外表指针ddscaps.dwCaps=DDSCAPS_BACKBUFFER;if ( lpDDSPrimary->GetAttachedSurface ( &lpDDSBack)!=DD_OK)returnFALSE;returnTRUE;}//-------------------------------------------------------//函数:FreeDDrawDirectDraw//-------------------------------------------------------voidFreeDDraw(void){if(lpDD!=NULL){if(lpDDSPrimary!=NULL){lpDDSPrimary->Release;lpDDSPrimary=NULL;}lpDD->Release;lpDD=NULL;}}//-------------------------------------------------------函数:MainLoop功能:玩耍主循环//-------------------------------------------------------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); //把它掉到后台进展操作}}三DirectDraw7DirecrDraw下面分别对这两个接口创立相应的主外表,通过对显存连续写20幅1024x768(24DirectDraw72070ms。而190ms持旧版本的,我们目前用的DirectDrawDirectDirectDraw7。下面是两者的分析数据:(一)DirectDraw:20101。(1〔DirectDraw〕20102。2〔DirectDraw7〕〔三〕性能分析:2070ms,DirectDrawDirectDraw1.5这里主要是争论了显存和系统内存的访问速度。当我们创立一个DirectDrawFlipBlt等就可以实现,或者创立多个离屏的外表,预先把数据写写到后存或离屏外表上更快些?下面就两方面分析:我们把后存外表或离屏外表创立在哪?显存呢?还是系统内存?分析:一般来说,我们的图象数据是放在文件里,当我们解码后数据一般是3/4。3SetDisplayMode(1024,768,24);图4 SetDisplayMode(1024,768,24);2-3ms,而系统外表到显存外表和显存间两外表的时间可以无视不计。如何把数据写到后存或离屏外表上更快些Win32GetDC;一个是直接写。由于directX最大的好处就是可以直接写数据到外表上,不用CPU析。分析:使用Win32的函数如GetDCGetDC猎取设备上下文DC〔DeviceContexWin32GDIGDIWindows序可以向外表写数据。但GDIGDI应用程序则显得太慢了。Lock函数,可以得到系统安排给外表5/6/7/8/9。5678Win32GetDC9用以得到图象的数据,固然LoadImage函数了。留意:假设想把外表创立在系统内存里,那么在外表属性设置时要置dwCaps=DDSCAPS_SYSTEMMEMORYdwCaps=DDSCAPS_VIDEOMEMORY。Lock、Unlock、GetDC、ReleaseDC。五DIRECTDRAW就我们开发中心板卡用到的DirectDraw接口,进呈现状和前景的浅分析。当前我们所用到的DirectDr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论