| 游戏图形底层设计 |
|
| 作者:不详 文章来源:不详 点击数: 更新时间:2005-8-21 |
在游戏中,计算机主要花时间在处理图象和画图象上,所以我们应尽力使这些操作适合主流机型的硬件水平或尽量少占用系统资源,这就是游戏图形底层设计的目的。在前面讲的DirectDraw和DirectX5 SDK中的Direct3D都是图形底层,还有ID在 QUAKE发行后提供的QUAKE C也是一种不错的图形底层。建立一套游戏图形底层需要大量的关于图形编程的知识和很多的时间精力,而且效果不一定好,同时在市场上也有很多图形底层可供选择。所以对于一般的游戏开发者来说,只要作的游戏使用的图象并没有使计算机不负重荷或并没有使用现有的底层所不支持的特性,我建议还是使用现有的底层。 本例程的图形底层十分简单,采用DirectDraw提供的IDirectDrawSurface_BltFast和IDirectDrawSurface_Blt函数: if (pbm->lpSurface) { if( pbm->bTrans ) bltflags = bTransDest ? DDBLTFAST_DESTCOLORKEY : DDBLTFAST_SRCCOLORKEY; else bltflags = bTransDest ? DDBLTFAST_DESTCOLORKEY : DDBLTFAST_NOCOLORKEY; ddrval = IDirectDrawSurface_BltFast( lpBackBuffer, x, y, pbm->lpSurface, &rc, bltflags | DDBLTFAST_WAIT); if (ddrval != DD_OK) { Msg("BltFast failed err=%d", ddrval); } } else { DDBLTFX ddbltfx; rc.left = x; rc.top = y; rc.right = rc.left + dx; rc.bottom = rc.top + dy; ddbltfx.dwSize = sizeof( ddbltfx ); ddbltfx.dwFillColor = pbm->dwColor; ddrval = IDirectDrawSurface_Blt( lpBackBuffer, // dest surface &rc, // dest rect NULL, // src surface NULL, // src rect DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); } 由于DirectDraw的通用性要求,所以虽然它提供的函数的速度很快,但是对特效的支持比较少。深入的图形底层应包括大量的高效的特效处理功能,所以我们应该能够直接对显存操作。 DirectDraw的DirectSurface提供了这个入口,它的DDSURFACEDESC结构中的变量 lpSurface就是显存映射的入口指针。 typedef struct _DDSURFACEDESC { DWORD dwSize; DWORD dwFlags; DWORD dwHeight; DWORD dwWidth; union { LONG lPitch; DWORD dwLinearSize; }; DWORD dwBackBufferCount; union { DWORD dwMipMapCount; DWORD dwZBufferBitDepth; DWORD dwRefreshRate; }; DWORD dwAlphaBitDepth; DWORD dwReserved; LPVOID lpSurface; DDCOLORKEY ddckCKDestOverlay; DDCOLORKEY ddckCKDestBlt; DDCOLORKEY ddckCKSrcOverlay; DDCOLORKEY ddckCKSrcBlt; DDPIXELFORMAT ddpfPixelFormat; DDSCAPS ddsCaps; } DDSURFACEDESC; 但是使用它之前,必须调用DirectDrawSurface3::Lock函数将此图形内存锁住, 在处理后,调用DirectDrawSurface3::Unlock函数将此内存交还给系统。 |
| 外挂文章录入:admin 责任编辑:admin |
|
上一篇外挂文章: 游戏交互设计 下一篇外挂文章: 《魔兽世界》的寻路体系和作弊原理分析 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |