游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2745|回复: 8

关于ID3DXSprite的奇怪问题

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-9-12 15:56:00 | 显示全部楼层 |阅读模式
使用ID3DXSprite在3D场景里渲染2D UI
平台XBOX360

//创建Sprite
D3DXCreateSprite(m_pD3DDevice,&m_pSprite) ;

//循环部分
m_pSprite->Begin(D3DXSPRITE_DONOTMODIFY_RENDERSTATE);

m_pSprite->Draw(m_pTexture, NULL,NULL,NULL,D3DCOLOR(0xFFFFFFFF));

m_pSprite->End();


症状:
Draw了4096次(也就是2的12次方次),第4097执行到End()出错

不知道是什么原因,个人猜想可能是哪里溢出了
循环过程中没有任何变量值发生变化,没有状态改变

我发现m_pTexture的fence值从0开始在以4递增,不知道和这个有没有关系

请高手指教……

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2006-9-12 17:06:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

Sprite内部肯定把顶点缓存起来了,4096*4=16K,你发现了它的顶点缓冲区大小,恭喜。

7

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2006-9-12 17:06:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

不会是把这句也放到循环里面了吧
D3DXCreateSprite(m_pD3DDevice,&m_pSprite) ;

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2006-9-12 17:38:00 | 显示全部楼层

Re: 关于ID3DXSprite的奇怪问题

lights说得有点道理,但是它内部为什么要把每次的顶点都缓存起来?没有意义啊……
那怎么阻止它这样缓存顶点呢?

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2006-9-13 09:51:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

有没有搞错!!!!
循环Begin()................End();干什么???
循环Draw()就行了!

修改为:
m_pSprite->Begin(D3DXSPRITE_DONOTMODIFY_RENDERSTATE);
for(4096次循环)
{m_pSprite->Draw(m_pTexture, NULL,NULL,NULL,D3DCOLOR(0xFFFFFFFF));}
m_pSprite->End();

关于ID3DXSprite这里讲了不少:
http://www.dingge.com/forum/index.asp?boardid=46

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2006-9-13 10:14:00 | 显示全部楼层

Re: 关于ID3DXSprite的奇怪问题

嗯……鼯鼠的这个……汗……

呵呵,首先Begin和End必须在BeginScene和EndScene之间执行,所以必须循环

证据:XBOX DK如是说

ID3DXSprite::Begin
Remarks
This method must be called from inside a IDirect3DDevice9::BeginScene . . . IDirect3DDevice9::EndScene sequence. Begin cannot be used as a substitute for either IDirect3DDevice9::BeginScene or BeginScene.



然后,我为什么要for(4096次循环)Draw 然后再End,呵呵,前4095次不是白白浪费GPU&CPU吗……

但是大家给我提供了一个思路,我在想,或许是不是Sprite的生命期只有4096次?

继续盼望高手指教……

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2006-9-14 08:40:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

这个一定不是每次,是单桢的问题,而且for 4096 再end才是正解,sprite的draw只是填入缓冲区,end才是真正的绘制。
这个问题应该是一个bug,不过我都是重写这部分的,所以没有用过本来的D3dxsprite, 具体就不是很清楚了。

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2006-9-15 14:56:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

大概你说的这个循环和我说的不是一个循环
// Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
      if ( SUCCEEDED( g_pSprite->Begin(D3DXSPRITE_ALPHABLEND) ) )
        {
                程序渲染部分
                 g_pSprite->End();                       
        }
       
      g_pd3dDevice->EndScene();
    }

这样的结构运行一天也不会出错

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-9-15 18:41:00 | 显示全部楼层

Re:关于ID3DXSprite的奇怪问题

如果真的 D3DXSPRITE 内部是 16K顶点BUFFER的话,你在DRAW时每 4096个画一批就是了.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 10:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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