困惑的意思:来自alpha混合的困惑



演示下载: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, dx, dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC ddsd;
IDirectDrawSurface *pdds;

//
// try to load the bitmap as a resource, that fails, try it as a file
//
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION);

(hbm NULL)
hbm = (HBITMAP)LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION);

(hbm NULL)
NULL;

//
// get size of the bitmap
//
GetObject(hbm, (bm), &bm); // get size of bitmap

//
// create a DirectDrawSurface for this bitmap
//
ZeroMemory(&ddsd, (ddsd));
ddsd.dwSize = (ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bm.bmWidth;
ddsd.dwHeight = bm.bmHeight;

(pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
NULL;

DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);

DeleteObject(hbm);

pdds;
}

代码中红色部分就是问题所在:默认情况下表面是放在显存中!!!

2D情况下表面渲染是由CPU而不是显卡来完成!当然没有直接操纵系统内存快

所以因该把上面那句改为:

ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;

指定表面是放于系统内存而不是显存中

好了改过的后问题解决!

第 2个另我费解问题是:

在本如果时候是翻转结构ALPHA混和会使画面出现问题且速度奇慢(FPS=4)

这是为什么呢?

哪位高手能否指点在下下?

e-mail:[email protected],oicq:30784290

website::http://kylinx.yeah.net



Tags:  alpha困惑

延伸阅读

最新评论

发表评论