会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 2D图形
来自alpha混合的困惑
发表日期:2006-08-20 22:59:02作者: 出处:  

演示程序下载: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

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00252