请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 3896|回复: 10

请教龚兄一个关于IDirect3DQuery9的问题 [复制链接]

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-5-27 22:08:44 |显示全部楼层
本帖最后由 sincrystal 于 2014-5-28 12:22 编辑

此问题困惑小弟已经很久,并且一直得不到完美解决,故来此请教,不知道龚兄是否遇到过同类问题。
渲染流程:
1,逻辑Update
2,在下面第4步遮挡剪裁通过的情况下,再进行摄像机剪裁
2,IDirect3DDevice9 :: BeginScene
3,各种渲染 --- 此时WriteZBuffer
4,循环(N次) -- <其中 N 大约为 300>
     {
         IDirect3DQuery9_list[ i ] -> Issue( D3DISSUE_BEGIN );
         渲染 用于遮挡剪裁的Box或者其他简单物体 -- 此时是关闭WriteZBuffer的
         IDirect3DQuery9_list[ i ] -> Issue( D3DISSUE_END );
     }
5,循环(N次)
     {
         while(IDirect3DQuery9_list[ i ] -> GetData((void *) &uiPixelsVisible, sizeof(DWORD), D3DGETDATA_FLUSH) ==S_FALSE);
         如果uiPixelsVisible不为0,则下一帧渲染时,此IDirect3DQuery9所代表的物件将可能被渲染,否则是一定不被渲染。
      }
6,各种Postprocess
7,IDirect3DDevice9 :: EndScene
8,IDirect3DDevice9 :: Present
9,循环到第一步

问题:在Win7下面会偶尔发生在while(IDirect3DQuery9_list -> GetData((void *) &uiPixelsVisible, sizeof(DWORD), D3DGETDATA_FLUSH) ==S_FALSE);这里不停循环,即GetData一直返回的S_FALSE。此时窗口一直显示未响应,按下Ctrl + Alt + Del 呼唤出任务管理器会让窗口回复正常,如果不这么做,则窗口会一直持续未响应。

我这么处理遮挡剪裁是否有问题,有没有好的方法来解决这个问题。
如果龚兄知道,请告知,谢谢。 如果有其他达人知道,也请告知,谢谢。

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2009-10-21
积分
2600
发表于 2014-5-28 10:43:27 |显示全部楼层
开DX DEBUG 看看 有没有error

使用道具 举报

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2009-3-31
积分
14151
发表于 2014-5-28 13:43:30 |显示全部楼层
我很早前就说过,d3d9已死,不要问我任何d3d9的问题。

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-5-28 14:33:36 |显示全部楼层
....DX9死是死了,但是问题是有一些项目还是在使用它。

龚兄以前没碰到过这样的问题么?或者说以前龚兄在使用IDirectQuery9的时候的使用方式是否是如上流程?
只是一个询问而已。

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-5-28 14:35:03 |显示全部楼层
本帖最后由 sincrystal 于 2014-5-28 14:37 编辑
32220937 发表于 2014-5-28 10:43
开DX DEBUG 看看 有没有error

不是很经常出现,一天可能一次都不出现,也可能出现多次。
不过有一个规律,就是开多个客户端的时候,出现的几率要大一些。
而且只在Win7的机器上出现, 32位和64位都可能,而XP的机器上从未出现过。

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2012-6-26
积分
1059
发表于 2014-5-29 15:53:49 |显示全部楼层
记一下时,一定时间没出来就返回FALSE,具体参看虚幻3代码 FD3D9DynamicRHI::GetQueryData

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-6-6 14:10:59 |显示全部楼层
本帖最后由 sincrystal 于 2014-6-6 14:33 编辑
焚花祭朝阳 发表于 2014-5-29 15:53
记一下时,一定时间没出来就返回FALSE,具体参看虚幻3代码 FD3D9DynamicRHI::GetQueryData ...

感谢祭朝阳兄,不过unreal3的这个方式几乎和我的方式是一样的,也就是超过时间后强制break。但是从这次以后,后面的所有getdata都不能获取正确的值,是否是getdata强制break后,就在几帧内不再执行硬件遮挡的getdata操作,而是采用正常的的视锥剪裁,等到正常后,再开始执行硬件遮挡的getdata?

但是疑问是什么时候才能知道getdata已经正常了呢?

或者说一旦出现这样的问题,就把所有IDirect3DQuery9全部release,再重新recreate?

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2012-6-26
积分
1059
发表于 2014-6-9 09:42:59 |显示全部楼层
sincrystal 发表于 2014-6-6 14:10
感谢祭朝阳兄,不过unreal3的这个方式几乎和我的方式是一样的,也就是超过时间后强制break。但是从这次以 ...

UE3只是调用了GetData和你几乎一样。。。因为肯定要调用这个啊,你从PerformViewFrustumCulling这个函数开始仔细研究一下吧

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-6-9 17:51:30 |显示全部楼层
本帖最后由 sincrystal 于 2014-6-9 17:52 编辑
焚花祭朝阳 发表于 2014-6-9 09:42
UE3只是调用了GetData和你几乎一样。。。因为肯定要调用这个啊,你从PerformViewFrustumCulling这个函数 ...

这部分是我重点看的代码,他内部依次调用了
1,ProcessPrimitiveCulling
2,ProcessPrimitiveCullingInner
3,UpdatePrimitiveOcclusion
4,RHIGetOcclusionQueryResult
5,GetQueryData
在GetQueryData返回false后,会设置bOutPrimitiveIsDefinitelyUnoccluded为true,且会执行
if(!bIsOccluded)
{
bNeedsPreRenderView |= ProcessVisible(ViewIndex, ViewVisibilityMap, CompactPrimitiveSceneInfo, DistanceSquared, bIsDefinitelyUnoccluded);
}
但是ProcessVisible这个函数中并没有对设备做任何处理。
如果一旦强制GetData超时跳出后,以后就永远都是GetData超时了,如何才能在跳出来后,下一帧进来使之恢复正常呢?我尝试过把所有的IDirect3DQuery9全部Release后,在Create。甚至把整个设备Recreate,都还是同样的问题。

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2012-6-26
积分
1059
发表于 2014-6-12 23:38:55 |显示全部楼层
sincrystal 发表于 2014-6-9 17:51
这部分是我重点看的代码,他内部依次调用了
1,ProcessPrimitiveCulling
2,ProcessPrimitiveCullingInner ...

加QQ讨论吧 私信我

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2010-7-6
积分
792
发表于 2014-6-15 11:42:40 |显示全部楼层
本帖最后由 sincrystal 于 2014-6-15 11:45 编辑

谢谢 焚花祭朝阳 兄的热心帮助,经过几天的测试,已经可以证明此问题已经彻底解决,在GetData中Break出来后,不会再出现永久性GetData失败的情况了,下一帧可能会ok~。是其他地方造成的,不是GetData本身的问题,但是具体为什么还需要下一阶段具体测试才能明白,等项目轻松一些了后,再进行打破沙锅问到底。

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-1-16 22:58 , Processed in 0.105516 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部