游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3988|回复: 7

程序最小化后就出错,已经写了恢复措施,还是不行

[复制链接]

33

主题

101

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2007-11-23 12:23:00 | 显示全部楼层 |阅读模式
是directdraw,只要一最小化,就会提示内存溢出,写到0x00000000地址去了。

我已经在渲染部分写上检查丢失的部分,不过由于是自己写的翻页,所以不好检查丢失,
就用了IsLost这个成员函数检查丢失,
但是只要一最小化,就会出问题,
请高手解答一下,是不是我检测丢失的方法不对?还是其他问题?

33

主题

101

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-23 18:02:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

是不是需要检查什么程序被激活什么的?

33

主题

101

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-24 19:53:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

你说的是什么意思?能具体点吗?
比如在每帧该做些什么?我都已经检测丢失了

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-11-24 23:36:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

设备丢失不是有个专门的函数吗?
         Render();
     hr=g_pD3DDevice->TestCooperativeLevel();
     while(hr==D3DERR_DEVICELOST)
     {
     
  beforeResetVertex();
  if(hr!=D3DERR_DEVICENOTRESET)
  {
   Sleep(1000);
   hr=g_pD3DDevice->TestCooperativeLevel();
  }
  if(FAILED(g_pD3DDevice->Reset(&d3dpp)))
  {
   hr=D3DERR_DEVICELOST;
  }
  else
  {
   resetVertex();
       g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
  }
这个代码是我用D3D设备丢失时候处理用的,在VS2005下可以通过编译并正确运作
如果在VS2003的话,那么里面释放必要的内存的语句的位置必须改变一下。DXUT用了回调函数然后就不需要搞这个次序,不过我没仔细研究DXUT,不好意思
希望这些对LZ有用

33

主题

101

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-25 11:29:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

楼上说的就和我想的一样。检测丢失,然后恢复,在每帧渲染的时候做,上面那兄弟说的,怎么检测最小化呢?
非激活了?
另外我不是最小化后回来变成黑屏,而是一最小化就出错~

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-11-25 12:02:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

我检测的不是最小化
直接检测是否设备丢失
当设备丢失的时候
以D3DPOOL_DEFAULT创建的资源要release掉
设备才能够被reset
最小化就出错估计是访问到已经被释放掉的内存
可以先试下如果什么都不渲染,也就是空空的只创建设备
这个时候处理设备丢失是否正常,如果正常的话,应该就是release资源的地方出了问题
LZ如果把我帖的代码用VS2003编译的话,可以告诉你,会出错,只要设备一丢失,立刻报错
VS2003好像是在reset执行前要释放资源,然后立刻创建再reset,很不符合逻辑,但却要这样才会正确通过编译
我写程序的机器坏了,代码找不到,很久没去弄这方面的问题了,只能和你说,去试试看
把release执行那些语句的位置改改看

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-11-25 12:08:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

         Render();
     hr=g_pD3DDevice->TestCooperativeLevel();
     while(hr==D3DERR_DEVICELOST)
     {
     
  beforeResetVertex();//释放D3DPOOL_DEFAULT中的资源,也就是***->release()
   resetVertex();  //重新创建那些刚才被释放的D3DPOOL_DEFAULT资源
  if(hr!=D3DERR_DEVICENOTRESET)
  {
   Sleep(1000);
   hr=g_pD3DDevice->TestCooperativeLevel();
  }
  if(FAILED(g_pD3DDevice->Reset(&d3dpp)))
  {
   hr=D3DERR_DEVICELOST;
  }
  else
  {
       g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
  }
差不多就是这个样
如果我没记错的话

33

主题

101

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-25 18:45:00 | 显示全部楼层

Re:程序最小化后就出错,已经写了恢复措施,还是不行

今天把翻页的用了他给的函数,然户检测丢失然后恢复就可以了,他的翻页(BltFast())在页面丢失的时候就会返回丢失,
我写的翻页没有,但是我用了另外一个检测丢失的函数(IsLost())也没反应,不知道为什么~不过用他的就是没问题了,也没释放什么,可能restore里面处理好了,而且最小化也没错误了,真是莫名其妙~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 08:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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