网页功能: 加入收藏 设为首页 网站搜索  
来自alpha混合的困惑
发表日期:2006-08-20作者:[转贴] 出处:  

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

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 来自alpha混合的困惑
本类热点文章
  在DirectX 8 中进行2D渲染
  DirectDraw打造极速图形引擎(一)
  用窗口模式运行游戏
  DirectDraw编程基础
  Windows的位图alpha混合技术
  再谈GDI模式作图
  终极优化你的游戏——使用脏矩形技术
  D3D8里面的2D图形编程
  全屏模式
  对2D游戏引擎设计的一些思考
  DirectX8中的二维图形高级技巧
  使用标准GDI实现游戏品质的动画系统
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00372