游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3999|回复: 5

direct draw如何获得丢失的设备

[复制链接]

3

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-1-10 17:34:00 | 显示全部楼层 |阅读模式
一个全屏幕程序,使用direct draw,设置ddraw的协作级别是排他性的,当最小化后,在恢复便丢失设备,无法渲染,使用directx7 sdk上的方法不能重新得到设备,有谁知道原因,请不吝赐教! [em4]

2

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-1-10 19:20:00 | 显示全部楼层

丢失后会得到事件通知,要求程序重新建立新的显存数据

丢失后会得到事件通知,要求程序重新建立新的显存数据

15

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2006-1-16 22:02:00 | 显示全部楼层

Re:direct draw如何获得丢失的设备

我也遇到过这个问题~

15

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2006-1-17 18:58:00 | 显示全部楼层

Re:direct draw如何获得丢失的设备

现在我知道解决的方式了  刚看到一本电子书上说的解决方法~
当一个DirectDraw程序被最小化时,它就丧失了对页面的控制权,如果我们的程序不知道,继续改变页面时就会发生"DDERR_SURFACELOST"错误。而当我们重新回到DirectDraw程序时Windows不会帮我们把页面恢复,如果我们不自己恢复页面用户就会看到黑屏。为了避免出现这种情况,我们可以写一个恢复页面的函数:
        void RestoreSurface( )
        {
                lpDD->RestoreAllSurfaces( ); //恢复所有页面
                ReloadBitmap( );//自己的调图函数,重新画上页面内容
        }

        值得注意的是Windows也不会帮我们恢复页面的实际内容,我们要象上面的程序那样,再调用自己的调图函数才行。应该什么时候调用RestoreSurface( )呢?是不是每一条改变页面的语句都要测试一下有没有发生DDERR_SURFACELOST错误呢?其实并不需要。一般游戏的引擎都是频繁刷新式,每秒钟要刷新几十次,每一次刷新必然要调用上面提到的Flip( )。所以我们可以写一个FlipSurface( )然后以后调用它来换页:
        void FlipSurface( )
{
                HRESULT ddrval;
        ddrval=lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
        if (ddrval==DDERR_SURFACELOST)
                RestoreSurface( );
}

上面的内容转载自那本书,书的名字我忘记了~

15

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2006-1-17 21:35:00 | 显示全部楼层

Re:direct draw如何获得丢失的设备

问题出在ddrval==DDERR_SURFACELOST
虽然这是我猜的但是我猜的应该没错~(不要脸,老是猜)
用DINPUT的时候我发现实际上不止一个DIERR_INPUTLOST错误还有别的像什么DIERR_INVALIDPARAM之类的   所以我认为在DDRAW中也不止一个DDERR_SURFACELOST错误实际上还有别的错误我们没有检测~

DX的设计者真是天才将DX中的成员都设计成用法基本上一样(其实也不是什么天才 本来就是应该那么设计 跟STL一样……)

15

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2006-1-17 21:38:00 | 显示全部楼层

Re:direct draw如何获得丢失的设备

ddrval==DDERR_SURFACELOST  这一句如果改成ddrval==DDERR_*   我猜(又来了)问题就解决了

也就是检测所有错误 就象用FAILED那样  也许用FAILED(ddrval)  来检测问题就解决了不过我没试试过~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 06:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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