演示程序下载:alpha.exe
一开始在写代码的时候都没注意到这个问题,因为当时没用到DDUTIL文件的DDLoadBitmap这个函数(都是自己写)
最近写了一个alpha混合的例子给网友看,为了简单,我就直接使用DDLoadBitmap这个函数创建一个位图表面问题出来了。在执行全屏幕alpha混合的时候速度奇慢,在我的CII950+256SDR的机子上FPS仅仅为3-4!还以为是自己的代码有问题,花了X个小时苦苦思索不得其解。终于在万般无奈的情况下,自己重写了创建位图表面的代码,这下好了,FPS一下就到了35-36。问题找到了,是DDLoadBitmap的问题。打开ddutil.cpp看看。
在其中的代码如下:
/*
* DDLoadBitmap
*
* create a DirectDrawSurface from a bitmap resource.
*
*/
extern "C" IDirectDrawSurface * DDLoadBitmap(IDirectDraw *pdd, LPCSTR szBitmap, int dx, int dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC ddsd;
IDirectDrawSurface *pdds;
//
// try to load the bitmap as a resource, if that fails, try it as a file
//
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION);
if (hbm == NULL)
hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
//
// get size of the bitmap
//
GetObject(hbm, sizeof(bm), &bm); // get size of bitmap
//
// create a DirectDrawSurface for this bitmap
//
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bm.bmWidth;
ddsd.dwHeight = bm.bmHeight;
if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
return NULL;
DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
DeleteObject(hbm);
return pdds;
}
代码中的红色部分就是问题所在:默认情况下,表面是放在显存中的!!!
2D情况下,表面的渲染是由CPU而不是显卡来完成的!当然没有直接操纵系统内存快。
所以因该把上面那句改为:
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
指定表面是放于系统内存而不是显存中。
好了,改过之后,问题解决!
第二个另我费解的问题是:
在本程序中,如果时候的是翻转结构的话,ALPHA混和会使画面出现问题,且速度奇慢(FPS=4)
这是为什么呢?
哪位高手能否指点在下一下?
我的e-mail:game-diy@163.com,oicq:30784290
website::http://kylinx.yeah.net