游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2298|回复: 4

!求助 关于directdraw的问题

[复制链接]

26

主题

39

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2008-8-10 12:59:00 | 显示全部楼层 |阅读模式
1   FPS问题    是全频模式下快一些  还是窗口模式快一些

2   显存      在全频模式下  把所有表面都存在显存中DDSCAPS_VIDEOMEMORY ,切换到桌面后,再切回
程序,就不能显示了 这是什么问题

3  更改显示模式     我再程序运行时,改变了显示器的分辨率,他就不能显示了,但是玩连连看的时候,
这么做,却可以正常显示,这是什么原因

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
发表于 2008-8-10 17:55:00 | 显示全部楼层

Re:!求助 关于directdraw的问题

回楼主:
1。一般来说是全屏快
2。是不是没翻页
3。那得看是全屏是窗口了

26

主题

39

帖子

78

积分

注册会员

Rank: 2

积分
78
 楼主| 发表于 2008-8-11 00:37:00 | 显示全部楼层

Re: !求助 关于directdraw的问题

感谢楼上的回复

1:    我的程序中  窗口比全频快一倍,directdraw初始化都跟一般的directdraw程序一样  页面翻转也是一样

2:   有翻页,我就只是把DDSCAPS_SYSTEMMEMORY改成DDSCAPS_VIDEOMEMORY

3:  全频窗口都一样

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2008-8-11 03:41:00 | 显示全部楼层

Re:!求助 关于directdraw的问题

1 全屏可以翻页,窗口只能blit,理论上全屏比窗口快。但具体操作会涉及道全屏的垂直刷新同步有没有设置。设置了同步,一般情况下,就会出现全屏很慢的状况。

2 设备丢失了吧,翻书去,每本书都会讲这个。

3 跟2一回事,人家的游戏做了设备恢复或者压根没用DirectX。

26

主题

39

帖子

78

积分

注册会员

Rank: 2

积分
78
 楼主| 发表于 2008-8-11 19:25:00 | 显示全部楼层

Re: !求助 关于directdraw的问题

以下是我的directdraw初始化


/**************************************************
*  函数名:  InitDDraw(...)
*  功能:  初始化DDraw,并且创建主表面和翻转缓冲表面
*           版权所有  mochsh, 2003
***************************************************/
BOOL CDDraw::InitDDraw(HWND hWd,
                                           BOOL bFScr,
                                           DWORD ScrW,DWORD ScrH,
                                           DWORD BitCount )
{
        //--------------------------按给出的条件初始化变量
        hWnd=hWd;
        bFullScr=bFScr;
        if(bFScr){//全屏模式
                if(ScrW <= 640)                { ScreenW = 640; ScreenH = 480; }
                else if(ScrW <= 800){ ScreenW = 800; ScreenH = 600; }
                else if(ScrW > 800) { ScreenW = 1024; ScreenH = 768; }
                else {ScreenW=800; ScreenH = 600;}
                if(BitCount<=8)                ScreenC = 8;
                else if(BitCount<=16)ScreenC = 16;
                else if(BitCount<=24)ScreenC = 24;
                else if(BitCount<=32)ScreenC = 32;
                else ScreenC=16;

        //检查模式是否有效
        CheckDisplayMode();
        }
        else{//窗口模式
                ScreenW=ScrW;
                ScreenH=ScrH;
        }

        //--------------------------初始化DirectDraw环境
        HRESULT ddrval;
        //创建DirectDraw对象
        ddrval = DirectDrawCreateEx(NULL,(void **) &lpDD,IID_IDirectDraw7,NULL);
        if( FAILED(ddrval) )        {
                //创建DirectDraw对象出错时进到这里来
                //在这里可以记录创建DirectDraw对象的出错信息
                return FALSE;
        }
        //******全屏模式***********//
        if( bFullScr ){
                //设置协作等级
                ddrval = lpDD->SetCooperativeLevel( hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT );
                if( FAILED( ddrval )){
                        //设置协作等级出错时进到这里来
                        //在这里可以记录设置协作等级的出错信息
                        return FALSE;
                }

                //设置显示模式
                ddrval = lpDD->SetDisplayMode( ScreenW,ScreenH,ScreenC,NULL,NULL);
                if( FAILED( ddrval ) ){
                        //设置显示模式出错时进到这里来
                        //在这里可以记录设置显示模式的出错信息
                        return FALSE;
                }

                //创建主表面
            DDSURFACEDESC2 ddsd;
            ZeroMemory(&ddsd,sizeof(ddsd));
            ddsd.dwSize = sizeof( ddsd );
            ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
            ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                                                          DDSCAPS_FLIP |
                                                          DDSCAPS_COMPLEX;
            ddsd.dwBackBufferCount = 1;
                ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
                if (ddrval!=DD_OK) {
                        //创建主表面出错时进到这里来
                        //在这里可以记录创建主表面的出错信息
                        return FALSE;
                }

                //创建后台缓冲表面
                DDSCAPS2 ddscaps;
                ZeroMemory(&ddscaps,sizeof(ddscaps));
                ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
                ddrval=lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);
                if (ddrval!=DD_OK) {
                        //获取后台缓冲表面出错时进到这里来
                        //在这里可以记录后台缓冲表面的出错信息
                        return FALSE;
                }
                return TRUE;
        }
        //******窗口模式***********//
        else{
                //设置协作等级
                ddrval=(HRESULT)lpDD->SetCooperativeLevel( hWnd, DDSCL_NORMAL );

                //创建主表面
                DDSURFACEDESC2         ddsd;
                ZeroMemory( &ddsd, sizeof(ddsd) );
                ddsd.dwSize = sizeof(ddsd);
                ddsd.dwFlags = DDSD_CAPS;
                ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
            //创建主表面,并取得指向主表面的指针lpDDSPrimary
                ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
                if( FAILED( ddrval )){
                        //创建主表面出错时进到这里来
                        //在这里可以记录创建主表面的出错信息
                        return FALSE;
                }

        //使用裁剪器
        UseClipper();

                //创建后台缓冲表面
                //:::::::ddsd前面已经声明
                ZeroMemory(&ddsd,sizeof(ddsd));
                ddsd.dwSize=sizeof(ddsd);
                ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
                ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
                ddsd.dwWidth  = ScreenW;//宽的分辨率
                ddsd.dwHeight = ScreenH;//高的分辨率
                //创建一后台缓冲表面
                ddrval = lpDD->CreateSurface( &ddsd, &lpDDSBack, NULL );
                if( FAILED( ddrval )){
                        //创建后台缓冲表面出错时进到这里来
                        //在这里可以记录创建后台缓冲表面的出错信息
                        return FALSE;
                }
        }

    return TRUE;
        //--------------------------初始化DirectDraw环境完成
}


以下是我的页面翻转
/**************************************************
*  函数名:  Flip(...)
*  功能:  翻转表面==>显示
*           版权所有  mochsh, 2003
***************************************************/
void CDDraw::Flip( LPRECT pRectWin )
{
    HRESULT   ddrval=1;

    if( lpDDSPrimary && lpDDSBack )
    {
        //检查表面是否丢失
        if (lpDDSPrimary->IsLost()==DDERR_SURFACELOST)
            lpDDSPrimary->Restore();
        if (lpDDSBack->IsLost()==DDERR_SURFACELOST)
            lpDDSBack->Restore();
        do{
            if(bFullScr==1)
                ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );
            else
                ddrval = lpDDSPrimary->Blt( pRectWin,lpDDSBack,NULL,DDBLT_WAIT,NULL);

            //翻转表面后的信息检测
            if( ddrval == DD_OK )
                break;
            else if( ddrval == DDERR_SURFACELOST ){
                if( FAILED(lpDDSBack->Restore()) )
                    break;
                if( FAILED(lpDDSPrimary->Restore()) )
                    break;
            }
            else if( ddrval != DDERR_WASSTILLDRAWING )
                break;
        }while( 1 );
    }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 16:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表