网站首页 | 工作总结 | 工作报告 | 工作计划 | 演讲稿 | 自我鉴定 | 思想汇报 | 心得体会 | 书信范文 | 职场知识 | 作文大全 | 述职报告 | 读后感
易啊教育网
您的位置:易啊教育网directx8.1directx8.1是什么 → 正文

directx8.1是什么

第一篇:directx8.1是什么

DirectX8.1 的 DirectDraw7 研究手记(一) 分类

DirectX2003-02-05 19:44 903 人阅读 评论(0) 收藏 举报 这几日修改以前写的基于 GDI 的小游戏,由于机器较慢,所以游戏运行很慢,所 以决定研究一下用 DirectX8.1 的 DirectDraw 来把游戏修改一下。

以前看过网上 朋友写的 DirectDraw 的资料,大多是写 IDirectDraw 接口的,于是决定研究一 下 IDirectDraw7 的使用。

DirectX8.1 中有关 DirectDraw 的接口共有 IdirectDraw、IdirectDraw2、 IdirectDraw3、IdirectDraw4 和 IdirectDraw7 这五种。

今天主要整理一下 idirectdraw7 的简单使用 原来使用 IdirectDraw 时大概是这样的, 一、 初始化 window 类型(全屏独占时类型用 popup) 二、 在初始化 window 后初始化 DirectDraw 三、 创建 DirectDraw 实例指针 lpDD 四、 lpDD->SetCooperativeLevel 设置显示全屏独占还是窗体 五、 lpDD->SetDisplayMode(640,480,8)设置显示模式 六、 DDSURFACEDESC ddsd 的信息配置 七、 lpDD->CreateSurface 创建主页面 八、 lpDDSPrimary->GetAttachedSurface ( &ddscaps, &lpDDSBack )提取 后台缓冲页面 九、 利用 DirectDraw 的函数对一些 bmp 处理,或者获取 hdc 对页面操作 lpDDSBack->GetDC(&hdc)??(略,以后再慢慢道来)。

十、 lpDDSPrimary->Flip(NULL,0) 一经 Flip,两个表面的指针互换! lpDDSPrimary 指向后台表面, 而 lpDDSBack 指向了原来的前台主表面. 十一、 释放所用资源。

void FreeDDraw(void) { if ( lpDD!=NULL ){ if ( lpDDSPrimary!=NULL ){ lpDDSPrimary->Release() ; lpDDSPrimary = NULL ; } lpDD->Release() ; lpDD = NULL ; } } 那么 idirectdraw7 怎样使用呢? 同上面它的应用只有一些不同 比如声明变量 原来是

LPDIRECTDRAW lpDD; //DirectDraw 对象 LPDIRECTDRAWSURFACE lpDDSPrimary ; //DirectDraw 主表面 LPDIRECTDRAWSURFACE lpDDSBack ; //后台缓冲表面 DDSURFACEDESC ddsd ; //表面描述 DDSCAPS ddscaps ; 现在是

LPDIRECTDRAW7 lpDD; //DirectDraw 对象 LPDIRECTDRAWSURFACE7 lpDDSPrimary ; //DirectDraw 主表面 LPDIRECTDRAWSURFACE7 lpDDSBack ; //后台缓冲表面 DDSURFACEDESC2 ddsd ; //表面描述 DDSCAPS2 ddscaps ; 而且声明完表面描述后应立即用 ZeroMemory( &ddsd, sizeof( ddsd ) ); ZeroMemory( &ddscaps, sizeof( ddscaps ) ); 这两个语句使 ddsd 和 ddscaps 中的变量都为零,如果不这样做下面的 CreateSurface 会不成功。

创建 lpDD 的指针时要用 if ( DirectDrawCreateEx(NULL, (void**)&lpDD,IID_IDirectDraw7, NULL)!=DD_OK ) return FALSE ; IID_IDirectDraw7 是 IdirectDraw7 的 GUID 接口名称,所以必须在 link 时有 dxguid.lib 库。

而原来只要有 Ddraw.lib 即可。

再有不同就是在 SetDisplayMode 函数原来有三个参数,现在有五个,后两个是 干什么用的 dwRefreshRate Refresh rate of the new mode. Set this value to 0 to request the default refresh rate for the driver. 大意是:用于设置显示时的刷新频率,(就是 65MHZ、75MHZ、85MHZ),如果设为 0 使用当前默认设 置。

dwFlags Flags describing additional options. Currently, the only valid flag is DDSDM_STANDARDVGAMODE, which causes the method to set Mode 13 instead of Mode X 320x200x8 mode. If you are setting another resolution, bit depth, or a Mode X mode, do not use this flag and set the parameter to 0. if ( lpDD->SetDisplayMode(640,480,8,0,0)!=DD_OK) return FALSE ; 然后其他的还如同原来使用, 一定有人认为 Idirectdraw 够用了,但是我想微软 出新的 idirectdraw 一定有它的道理,至少不会越弄越糟吧。

下面有一个历程,框架用的是我的朋友 n5 的一个小例子的框架。

#include <windows.h> #include <windowsx.h> #include <ddraw.h> //全局变量 LPDIRECTDRAW7 lpDD; //DirectDraw 对象 LPDIRECTDRAWSURFACE7 lpDDSPrimary ; //DirectDraw 主表面 LPDIRECTDRAWSURFACE7 lpDDSBack ; //后台缓冲表面 HDC hdc ; char szMsg1[]="我的第一个 DirectDraw 程序" ; char szMsg2[]="按 ESC 退出" ; BOOL bActive = TRUE ; HWND hwnd ; //函数声明 LRESULT CALLBACK WinProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) ; BOOL InitWindow ( HINSTANCE hInstance, int nCmdShow ) ; BOOL InitDDraw ( void ) ; //初始化 DirectX void FreeDDraw ( void ) ; //释放 DirectX 对象 void MainLoop ( void ) ; //游戏主循环 //------------------------------------------------------//函数:WinMain() //功能:Win32 应用程序入口函数.进行初始化工作,处理消息循环 //------------------------------------------------------int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg ; //初始化主窗口 if ( !InitWindow(hInstance,nCmdShow) ) return FALSE ; //初始化 DirectDraw 环境,并实现 DirectDraw 功能 if ( !InitDDraw() ){ MessageBox ( GetActiveWindow(), "初始化 DirectDraw 过程中 出错!", "Error", MB_OK ) ; FreeDDraw () ; DestroyWindow ( GetActiveWindow() ) ; return FALSE ; } while(1){ if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ){ 如果有消息就处理消息 // if ( !GetMessage(&msg, NULL, 0, 0 ) ) return msg.wParam; TranslateMessage ( &msg ); DispatchMessage ( &msg ); } else if(bActive){ 循环 MainLoop(); } //等待消息 else WaitMessage(); } return msg.wParam ; } //-------------------------------------//函数:InitWindow() //功能:创建主窗口 //-------------------------------------static BOOL InitWindow ( HINSTANCE hInstance, int nCmdShow ) { // HWND hwnd ; //窗口句柄 WNDCLASS wc ; //窗口类结构 //填充窗口类结构 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_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL ) ; //如果程序处于激活状态,进入游戏主 if ( !hwnd ) return FALSE ; ShowWindow ( hwnd, nCmdShow ) ; UpdateWindow ( hwnd ) ; return TRUE ; } //-------------------------------------------------//函数:WinProc() //功能:处理主窗口消息 //-------------------------------------------------LRESULT CALLBACK WinProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch ( message ){ case WM_ACTIVATEAPP

bActive = wParam; break; case WM_KEYDOWN

//击键消息 switch ( wParam ){ case VK_ESCAPE

PostMessage ( hWnd, WM_CLOSE, 0, 0 ) ; break ; } break ; case WM_SETCURSOR

SetCursor ( NULL ) ; return TRUE ; case WM_DESTROY

//退出消息 FreeDDraw () ; PostQuitMessage ( 0 ) ; break ; } //调用缺省消息处理过程 return DefWindowProc ( hWnd, message, wParam, lParam ) ; } //---------------------------------------------------------------//函数

InitDDraw() //功能

初始化 DirectDraw 环境并实现其功能.包括:创建 DirectDraw 对象, //设置显示模式,创建主表面 //---------------------------------------------------------------BOOL InitDDraw (void) { DDSURFACEDESC2 ddsd ; //表面描述 DDSCAPS2 ddscaps ; // HDC hdc ; //设备环境句柄 //创建 DirectDraw 对象 if ( DirectDrawCreateEx(NULL, (void**)&lpDD,IID_IDirectDraw7, NULL)!=DD_OK ) return FALSE ; //取得独占和全屏模式 if ( lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_EXCLUSIVE|DDSCL_F ULLSCREEN)!=DD_OK ) return FALSE ; //设置显示模式 if ( lpDD->SetDisplayMode(640,480,8,0,0)!=DD_OK) return FALSE ; //填充主表面信息 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 ) return FALSE ; //提取后台缓存表面指针 ddscaps.dwCaps = DDSCAPS_BACKBUFFER ; if ( lpDDSPrimary->GetAttachedSurface ( &ddscaps, &lpDDSBack )!=DD_OK ) return FALSE ; return TRUE ; } //------------------------------------------------------//函数:FreeDDraw() //功能:释放所有的 DirectDraw 对象 //------------------------------------------------------void FreeDDraw(void) { if ( lpDD!=NULL ){ if ( lpDDSPrimary!=NULL ){ lpDDSPrimary->Release() ; lpDDSPrimary = NULL ; } lpDD->Release() ; lpDD = NULL ; } } //------------------------------------------------------//函数:MainLoop() //功能:游戏主循环 //------------------------------------------------------void MainLoop (void) { static int i = 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){ //一经 Flip, 两个表面的指针互换!lpDDSPrimary 指向后台表面,所以 FreeDDraw() ; //你就看到刚才在后 台表面上写的字了,而 lpDDSBack 指向了原来的前台主表面 PostQuitMessage(0); 进行操作 } } DirectX8.1 的 DirectDraw7 研究手记(二) 上 //把它掉到后台 分类

DirectX2003-02-17 11:03 1663 人阅读 评论(0) 收藏 举报 上一次,我们创建 DirectDraw7 的接口指针时用的是 DirectDrawCreateEx(NULL, (VOID**)&m_pDD, IID_IDirectDraw7, NULL);其中 m_pDD 是 LPDIRECTDRAW7 m_pDD 的定义而来。其实还有一种方法是通过 IdirectDraw 来挂接 IdirectDraw7 的方法 QueryInterface。 HRESULT LPDIRECTDRAW LPDIRECTDRAW7 if(hRet != DD_OK) { // if failed, quit the app return; } // Fetch DirectDraw7 interface hRet = pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&m_pDD); pDD->Release(); ??这时你就申请到了 ??下面和上一节用法一样???? ??编译的时候别忘了 link ddraw.lib dxguid.lib hRet; pDD; m_pDD; hRet = DirectDrawCreate( NULL, &pDD, NULL ); 上回是显示文字这次我们显示图片;(由于做为入门演示所以尽量读取 256 色一下的图片)。 DirectX8.1 的 DirectDraw7 研究手记(二) 中 分类

DirectX2003-02-17 10:56 981 人阅读 评论(0) 收藏 举报 我们边看程序边讲解,程序的框架是用 vc6 的 windows application 生成的 hello World 改写的。

这里没有解释程序在 Alt+Tab 切换一次后图片不见的问题, 也没有说为什么用 BltFast 而没用 Blt, 同样也没有说 AddRef()函数是干什么的。 没用 g_lpdd->CreatePalette(,,,,);函数时,用 256 色即#define BPP 8 时,可能会有颜色失真,而 16 位 色/时就不必用这个函数了!也不会有颜色失真。不过先这样用着,以后我在解释。

// directx.cpp

Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" #include <ddraw.h> #define MAX_LOADSTRING 100 // Global Variables

HINSTANCE hInst; instance TCHAR szTitle[MAX_LOADSTRING]; text TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text // The title bar // current // Foward declarations of functions included in this code module

ATOM BOOL LRESULT CALLBACK MyRegisterClass(HINSTANCE hInstance); InitInstance(HINSTANCE, int); WndProc(HWND, UINT, WPARAM, LPARAM); //---------------------全局变量和一些预定义宏--------------------------------------//这两个预定义宏是为了方便释放指针用的在下面的 FreeDraw()函数中有用 #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //显示模式的设定 640×480×8 #define WIDTH 640 #define HEIGHT 480 #define BPP 8 //试试#define BPP 16 会有什么效果?? //没用 g_lpdd->CreatePalette(,,,,);函数时,用 256 色即#define BPP 8 时,可能会有颜色失真, 而 16 位色//时就不必用这个函数了!也不会有颜色失真。

HRESULT initDirectDraw(HINSTANCE hInst);//初始化 DirectDraw HRESULT MainLoop();//熟称 GameLoop void FreeDraw();//释放所有 DirectDraw 的指针 LPDIRECTDRAW7 g_lpdd;//指向实体的指针 LPDIRECTDRAWSURFACE7 g_lpFrontSurface;//A page LPDIRECTDRAWSURFACE7 g_lpBackSurface;//B page LPDIRECTDRAWSURFACE7 g_lpOffScreen;//用于后台的离屏页面 BOOL g_bActive=TRUE;//决定 mainloop 是否运行的标志 //----------------------------------------------------------------------------//Function:iniDirectDraw() //用于初始化 //完成任务:创建 g_lpdd 指针实体、获取显示模式、设置显示模式、制作页面信息 // 创建主表面对象、提取后台缓存表面指针、用图片创建离屏页面 HRESULT initDirectDraw(HINSTANCE hInst) { HRESULT hr; DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; ZeroMemory(&ddsd,sizeof(ddsd)); ZeroMemory(&ddscaps,sizeof(ddscaps)); FreeDraw(); //创建 g_lpdd 指针实体 if(FAILED(hr = DirectDrawCreateEx(NULL, (void**)&g_lpdd,IID_IDirectDraw7, NULL))) return E_FAIL; //获取显示模式 if(FAILED(hr = g_lpdd->SetCooperativeLevel(GetActiveWindow(),DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN))) return E_FAIL; //设置显示模式 if(FAILED(hr = g_lpdd->SetDisplayMode(WIDTH,HEIGHT,BPP,0,0))) return E_FAIL; //制作页面信息 ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1 ; //创建主表面对象 if(FAILED(hr = g_lpdd->CreateSurface(&ddsd,&g_lpFrontSurface,NULL))) return E_FAIL; //提取后台缓存表面指针 ddscaps.dwCaps = DDSCAPS_BACKBUFFER; if(FAILED(hr = g_lpFrontSurface->GetAttachedSurface(&ddscaps,&g_lpBackSurface))) return E_FAIL; g_lpBackSurface->AddRef();//没有他似乎也能运行正常? //用图片创建离屏页面 HBITMAP BITMAP hbm=NULL; bmp; // IDB_BITMAP1 是图片资源 hbm = (HBITMAP) LoadImage( GetModuleHandle(NULL), MAKEINTRESOURCE( IDB_BITMAP1 ), IMAGE_BITMAP, 1500, 280, //图片读取进来后变形成多大的尺寸 width,height LR_CREATEDIBSECTION ); GetObject( hbm, sizeof(bmp), &bmp ); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; ddsd.dwWidth = bmp.bmWidth ; ddsd.dwHeight = bmp.bmHeight ; hr = g_lpdd->CreateSurface(&ddsd,&g_lpOffScreen,NULL); if(FAILED(hr)) { if(hr == DDERR_OUTOFVIDEOMEMORY) {//这是最后机会 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; if(FAILED(hr = g_lpdd->CreateSurface(&ddsd, &g_lpOffScreen, NULL ))) return E_FAIL; } } HDC hdc; HDC hdcImage; hdcImage = CreateCompatibleDC(NULL); SelectObject(hdcImage, hbm); g_lpOffScreen->Restore(); g_lpOffScreen->GetSurfaceDesc(&ddsd); if((hr = g_lpOffScreen->GetDC(&hdc))==DD_OK) { StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0, 0, bmp.bmWidth ,bmp.bmHeight g_lpOffScreen->ReleaseDC(hdc); } DeleteDC(hdcImage); , SRCCOPY); return S_OK; } //这里的宏在最上面定义了 void FreeDraw() { SAFE_RELEASE(g_lpFrontSurface); SAFE_RELEASE(g_lpBackSurface); SAFE_RELEASE(g_lpOffScreen); SAFE_RELEASE(g_lpdd); } //Function:MainLoop() // // HRESULT MainLoop() { HRESULT hRet; RECT rect; rect.left =0; rect.top = 0; rect.right = 150; rect.bottom = 140; //从离屏页面把存在 OffScreen 的图片取出 rect 举行位置的图片,拷贝到后台缓存中 g_lpBackSurface->BltFast(0,0,g_lpOffScreen,&rect,DDBLTFAST_NOCOLORKEY); //后台缓存画上了图象,那么就 Flip 放到前台让他显示出来 g_lpFrontSurface->Flip(NULL, 0 ); return S_OK; } DirectX8.1 的 DirectDraw7 研究手记(二) 下 分类

DirectX2003-02-17 10:34 962 人阅读 评论(0) 收藏 举报 //下面主要是消息循环,根普通程序不一样 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR int { // TODO

Place code here. MSG msg; HACCEL hAccelTable; // Initialize global strings lpCmdLine, nCmdShow) LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_DIRECTX, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization

if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_DIRECTX); //初始化 DirectDraw 环境,并实现 DirectDraw 功能 if (FAILED(initDirectDraw(hInstance))){ MessageBox ( GetActiveWindow(), "初始化 DirectDraw 过程中出错!", "Error", MB_OK ) ; FreeDraw() ; DestroyWindow ( GetActiveWindow() ) ; return FALSE ; } // Main message loop

while (1) { if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!GetMessage(&msg, NULL, 0, 0)) { return msg.wParam ; } if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else if(g_bActive) { if(FAILED(MainLoop())) { FreeDraw(); MessageBox( GetActiveWindow(), TEXT("Displaying the next frame failed. ") TEXT("The sample will now exit. "), TEXT("DirectDraw Sample"), MB_ICONERROR | MB_OK ); PostQuitMessage(0); } } else WaitMessage(); } return msg.wParam; } // // { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style wcex.lpfnWndProc wcex.cbClsExtra wcex.cbWndExtra wcex.hInstance wcex.hIcon wcex.hCursor wcex.hbrBackground wcex.lpszMenuName wcex.lpszClassName wcex.hIconSm = 0; = hInstance; = LoadIcon(hInstance, (LPCTSTR)IDI_DIRECTX); = LoadCursor(NULL, IDC_ARROW); = (HBRUSH )GetStockObject(BLACK_BRUSH); = NULL; = szWindowClass; = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); = CS_HREDRAW | CS_VREDRAW; = (WNDPROC)WndProc; = 0; FUNCTION

MyRegisterClass() PURPOSE

Registers the window class. ATOM MyRegisterClass(HINSTANCE hInstance) return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_ACTIVATEAPP

g_bActive=wParam; break; case WM_KEYDOWN

if(wParam == VK_ESCAPE) { PostQuitMessage(0); return 0; } break; case WM_DESTROY

FreeDraw(); PostQuitMessage(0); break; default

return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } DirectX8.1 的 DirectDraw7 研究手记(三) 分类

DirectX2003-02-15 13:31 963 人阅读 评论(0) 收藏 举报 一、在何种情况下应该选择 IDirectDrawSurface::Blt 方法,在何种情况 下应该选择 IDirectDrawSurface::BltFast 方法。(这段解释是从别人那里 copy 过来的,但不知正确与否,但我觉得讲的有理) 1. 如果你正在从一个隐屏缓冲区中进行一次按位隔行拷贝,你应当使用 IDirectDrawSurface::BltFast。

2. 如果你的系统显存中是使用硬件进行按位隔行拷贝, 你虽然不会真正提高拷 贝的速度,但是,它会节省系统模拟硬件时间,从而使整个按位隔行拷贝时 间缩短约 10%。因此,我推荐读者使用 IDirectDrawSurface::BltFast 进行 所有的显示操作(从显存按位隔行拷贝到显存中)。

3. 如果你正在从系统内存中按位隔行拷贝,或者要求专门的硬件标志位,这样 的话,你就必须使用 IDirectDrawSurface::Blt。

二、AddRef()函数是干什么的? IDirectDrawSurface7::AddRef() DirectX8 SDK HELP 中相关的原文是这样的 Increases the reference count of the object by 1. When the object is created, its reference count is set to 1. Every time an application obtains an interface to the object or calls the AddRef method, the object's reference count is increased by 1. Use the Release method to decrease the object's reference count by 1. 大意是说:AddRef()函数用来给 object 中表示 object 有多少个“关联”的总数值加 1。

而当 Release 被调用时,这个值减 1。

而我观察 DirectX 所附带的例子里有用 AddRef()函数的地方,有两种

1. 在 g_lpFrontSurface->GetAttachedSurface(&ddscaps,&g_lpBackSurface)之后,即“前台缓存页面 GetAttachedSurface 后台缓存页面”之后,用过 g_lpBackSurface->AddRef();。 2. 另一种情况是:假设有两个 DirectDraw 实体,我们申请了两个指针,LPDIRECTDRAW7 lpDD1,lpDD2;, 而一个页面是由 lpDD2->CreateSurface 创建的,传递到 lpDD1 中做它的一个页面后,用 了一次 AddRef(); 所以大概那段英文是说这个函数应该用在取得一个不是由自身 DirectDraw 指针的 CreateSurface 创建的 Surface 后,用 IDirectDraw7::AddRef。大致我只能这样理解了,如 果那位兄台有高见,希望还请好不保留的赐教。

三、Alt+Tab 一次后,页面丢失的问题。

我们用一个函数 IDirectDrawSurface7::Restore();这个函数只能恢复页面原来所站有的 内存位置大小,但不能恢复原来的内容,所以还要我们手工把内容重新装入。在 DirectDraw 程序中只要页面丢失,所有的 DirectDraw 函数都会不作任何事情,只返回 DDERR_SURFACELOST 表示页面丢失。同时 IDirectDrawSurface7::IsLost()也有函数来判断 页面是否丢失。如果调用成功,返回值是 DD_OK,表明页面内存没有被释放。如果调用失 败,返回值可能是下列值之一

DDERR_INVALIDOBJECT ;DDERR_INVALIDPARAMS ;DDERR_SURFACELOST 原来是有多少 Surface 就要逐个调用,现在 IDirectDraw7::RestoreAllSurface()解决了这 个问题,只要调用一次 DirectDraw 的实体指针的 RestoreAllSurface()一次就可以恢复所有相 关页面的内存大小和位置。内容还是要重新调入的。(我想那个 AddRef()函数可能就和这 RestoreAllSurface()有一些关联吧!) 三、不需要调色板的时候?? 在 displaymode 设置为 640×480×8 位(256 色)时要用调色板管理页面色彩,否则, 像上一讲中的例子有时就会产生失真。而 640×480×16 位色时就算不 CreatePalette 也不会 产生颜色失真。 在“老王”的 directx 手册中有这样一句话:“那些使用 16 位或更高位像素格式的页 面并不使用调色板。”

第一篇:directx8.1是什么

维普资讯 ZH U AN  J A  ZU O  T AN G  I 目■国■里豳   世 界 ,尽   Di e t r c X 8  . 在上 期 的 文章 里 , 向大 家 详 细 阐述 了 Di e t 我 r c X  7 / Gr p i /8 9 a h c的工 作 原理 ,各 版本最 主 要 的技术 特  性和 3 D特 效 。在这 +申请认证

第一篇:directx8.1是什么

DirectX与显卡性能的关系.txt 在3D游戏日益成熟的今天,当前的电脑配件中,没有任何配件的发展速度可以能与图形芯片的发展速度相提并论,显示卡是目前更新换代的速度是最快的。自第一片的3D显示卡从3dfx的实验室诞生,就预示着他的出现将大幅拉近现实与梦想之间距离,让游戏环境更接近于自然环境,3D概念革命也必将席卷整个显示卡行业。可是在我们享受这些逼真的游戏环境、感叹游戏中3D世界的精明时候,是否想到3D图形显示芯片后面还有几个幕后的英雄?画面的美轮美奂与自然逼真其实离不开OpenGL和DirectX这两位幕后的英雄。    今天这里主要讨论一下DirectX对显示性能的影响,在说起DirectX前,先回顾一下DirectX的发展历程。DirectX是一种图形应用程序接口(API),简单的说它是一个辅助软件,一个提高系统性能的加速软件,微软创建开发的。它的意思不难理解,Direct是直接的意思,X是很多东西,加在一起就是一组具有共性的东西,这个共性就是直接。微软定义它为“硬件设备无关性”。DirectX主要由以下几个部分组成:   1、 DirectDraw(2D绘图)   2、Direct3D(3D绘图)   3、DirectSound(声音相关)   4、DirectMusic(MIDI相关)   5、DirectInput(输入相关)   6、DirectPlay(网络相关)   7、DirectSetup(Setup相关)   8、DirectShow(动画播放)   9、DirectAnimation(整合动画环境)   DirectX的第一个版本DirectX1.0的发布是Window95问世后,从那个时候开始微软开始根据硬件制造厂商和游戏厂商合作共同更新升级DirectX的标准。随着DirectX版本的不断升级,它的功能越 碓角看螅 发展到现在,DirectX已经成为游戏的工业标准。   我们也不要认为DirectX一出来就在显示领域树立了权威,在DirectX7以前,它是默默无闻的,这时候GeForce256首次在桌面产品中引入了T&L技术,而DirectX7凭借对它良好的支持赢得了游戏开发商的广泛认同,开始3D显示领域树立自己的权威了,在DirectX8中,首次引入了Pixel Shader和完善了Vertex Shader,让游戏开发者有了充分发挥想象力的广阔空间,而且DirectX8使用MAX FX的图形引擎,增加了图形引擎在光照效果的处理能力,自此3Dmark2001SE与DirectX8.1一道成为了3D图形显示领域的权威,龙头位置无人能及。2002年底发布了DirectX9.0,更是一鸣惊人,新的PS2.0和VS2.0让游戏显示画面达到游戏真正电影级效果,那么DirectX对显示效果的影响到底如何呢?下面我们用一片支持DirectX8.1的显卡在DirectX8和DirectX9的环境下的得分来分析。显卡采用铭 u科技的光之翼Ti4400,它完整支持DirectX8.1,是个理想的选择。   硬件测试平台:   CPU AMD Athlon2400+ 主板 硕泰克SL-KT600-R   内存 Kingston KVR400X64C3A/256 显示卡 光之翼TI4400   硬盘 Maxtor D740X-6L 光驱 台电48XCOMBO   电源 世纪之星300W         软件平台如下:   操作系统 Winxp+SP1 测试软件 3Dmark2001SE(330)   驱动版本 52.16 QuakeIII   DirectX DirectX8.1、DirectX9.0B     VIA补丁 安装4in1        测试原则:   1.全新安装WinXP(包含SP1),安装VIA补丁,安装测试显示卡驱动程序,安装测试软件,因为WinXP自带DirectX8.1,因此不需要另外安装DirectX8.1,更不需要安装DirectX9.0B,做好一个GHOST备份。确认系统所带DirectX8.1(方法:在“开始”菜单的“运行”栏目中运行“Dxdiag”)。   2.待基于DirectX8.1的测试完毕,格式化C盘,启用第一步的GHOST备份文件,安装DirectX9.0B,确认系统DirectX9.0B已经安装,如下截图3:   3.桌面颜色为32bit,分三个分辨率测试。有些朋友也许不明白,为什么不采用3Dmark03和Aquamark3进行对比,这两个软件需要系统安装DirectX9.0,在安装DirectX8.1的时候无法运行,自然无法比较,况且业界对3Dmark03的公证性颇有置疑。   软件   分辨率 3Dmark2001SE(330) QuakeIII   DirectX8.1 DirectX9.0B DirectX8.1 DirectX9.0B   800x600 10649 11126 190.9 194.7   1024x768 9742 10042 185.7 189.0   1280x1024 7994 8271 161.3 163.9      从上面简单的测试数据可以看出,DirectX版本不同,性能表现也是不同。当DirectX版本升级到DirectX9.0B的时候,所有性能的测试得分都有一定的提高,DirectX版本是向前兼容的,新的版本兼容老的版本,就目前的主流游戏来看,绝大多数都是基于DirectX8的,因此针对这类游戏,我们的显卡支持的DirectX版本最好支持DirectX8或者更高,从测试得分看来,即使是支持DirectX8.1的显卡,在必要的情况下,可以将DirectX版本升级到更高,游戏的性能或者系统性能都有一定的提高,从某方面来说,这是硬件不足,软件来补,虽然在特效上DirectX8的显卡补能完全发挥到DirectX9显卡的水准,但是相比DirectX8版本的性能还是有提高,而且这基本不需要什么代价和投入,这个性能提高简直是免费的,建议目前大多玩家可以将DirectX版本升级到最新。   后记:DirectX为游戏而生   DirectX是伴随着视窗操作系统的推出而出现的,DirectX的原名为 DirectX SDK(或Game SDK ),英文原意:DirectX Software Development Kit,是微软所开发出的一套主要用在设计多媒体、2D、3D 游戏及程序的 API ,其中包含了各类与制作多媒体功能相关的组件(Componet),各个组件提供了许多处理多媒体的接口与方法。从这点介绍我们可以领会到DirectX是为游戏而诞生,从DirectX1.0到DirectX3.0,微软让它的DirectX开始在游戏领域树立起3D的标杆,尽管当时的3D很粗糙,但是雏形已初步形成,到DirectX7开始,随着OpenGL和Glide势力日渐衰弱,DirectX的霸气初现,到DirectX8发布后,DirectX已经在3D游戏领域树立起它的的权威地位,引人的Ps和Vs的出现令OpenGL和Glide自叹不如,如今新的DirecetX9.0,更是如日中天,权威地位无人能撼动
directx8.1是什么》由(易啊教育网)整理提供,版权归原作者、原出处所有。
Copyright © 易啊教育网 All Rights Reserved.