游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4908|回复: 13

hmhm的D3D白痴问题一罗筐

[复制链接]

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-5-21 02:26:00 | 显示全部楼层 |阅读模式
最近开始转学D3D8了,狂啃SDK文档中。E文不好的我看起文档来难免有如蜻蜒点水般地跳阿跳的,所以总会有一些的白痴问题提出。希望大家如有能力解答我的提问,请不要吝惜您的时间,烦劳您为我解惑。在此hmhm先向各位表示感谢。

我今后如有关于D3D的疑问都会在此贴中提出,请大家多多帮助我这个初学者。^_^

问题1:
今天在看SDK的关于IDirect3DDevice8::SetIndices的说明时,看到上面有说“When the index buffer is no longer needed, set it to NULL. If you fail to do this, the index buffer is not released, resulting in a memory leak.”。它所说的不再需要一个index buffer的时候,是指的什么时候?是指我在切换顶点流,或是切换索引缓冲的时候就应该调用SetIndices(0,0)?或是指在这个索引或是流不再用到的调用SetIndices(0,0)?(这时应该是调用Release()吧?)
翻阅了一下SDK文档,好像是SetXXX的函数一部分都有提到“在不再需要某个对象时调用SetXXX(NULL,XXX)来释放它”。具体这个时候是指什么时候呢?再重新设置流或是索引、纹理之前就应该调用SetXXX(NULL,XXX)来释放它吗?

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2004-5-21 07:57:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

就是你再也用不到的时候,
通常在退出时,
有些时候,有些情况,
在程序运行中也这么做。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
 楼主| 发表于 2004-5-21 08:47:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

感谢kiyouss的回复。但我感觉您说得不是很清楚。因为按照COM规范来实现的DX组件,在通过调用Release()接口来使引用变为0的时候,对象应该自行释放分配的资源。这个对象的释放问题似乎在使用DirectDraw的时候就没有向使用D3D时这样明确的提出来(也可能是我没有认真的看),而D3D的SetXXX函数则都有明确的提到要对对象进行释放。

15

主题

155

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2004-5-21 11:12:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

对象释放和对象分配的内存释放是两码事

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
 楼主| 发表于 2004-5-21 11:49:00 | 显示全部楼层

Re: Re:hmhm的D3D白痴问题一罗筐

desher: Re:hmhm的D3D白痴问题一罗筐

对象释放和对象分配的内存释放是两码事

非常感谢。
这个我当然清楚。但按照COM规范,在一个COM对象的引用计数为0时,它就应该释放自己分配的资源,然后再释放它本身。但是就因为如此,创建一个COM对象,在不再使用的时候Release它,这是毫无疑问的,但在SDK文档中明确的提到了“在不再需要它时释放它,不然就会造成内存泄漏”。但在正常情况下,创建一个COM对象,必然要Release它,而D3D里却是明确的提到要释放它,这让我感到不解。

15

主题

155

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2004-5-21 14:34:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

比如你在程序中new一个字符串,你的程序退出前不释放这块内存,程序退出,系统不会帮你释放这块内存。微软说When the index buffer is no longer needed, set it to NULL. If you fail to do this, the index buffer is not released, resulting in a memory leak.的意思就是这块内存交给你了,你负责释放他,D3D不负责释放他。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
 楼主| 发表于 2004-5-21 15:00:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

感谢您的回复。

创建一个COM对象,然后调用Release()使其的引用计数变为0,从而释放这个对象及其分配的资源。就相当于你malloc一块内存,在正常情况下必然会去调用free来释放它一样。而这样的基本常识,我感觉微软在这个地方写出来,很容易误导人。

在程序中尝试了一下重新设置流、纹理或是顶点索引,不调用SetXX(NULL,XXX),也没有出现内存泄漏的报告。

“When the index buffer is no longer needed, set it to NULL. If you fail to do this, the index buffer is not released, resulting in a memory leak”。

“set it to NULL”,大概是指调用对象的Release方法,而不是指用NULL为参数来调用这个函数。或许是我没有结合说明的上下文来理解这句话。但是我觉得在某些说明里这样提出来还真是能误导人呢。

0

主题

130

帖子

130

积分

注册会员

Rank: 2

积分
130
发表于 2004-5-21 15:54:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

我想可能是硬件资源的释放,你这里Release的只是内存中的对象,但是硬件的VB IB可能并没有释放.

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
 楼主| 发表于 2004-5-21 23:10:00 | 显示全部楼层

Re:hmhm的D3D白痴问题一罗筐

感谢老孩子的回复。
如果调用SetXXX(NULL,xxx)来释放硬件资源的话,应该是在什么时候做呢?是在切换数据流的时候?还是应该在别的时候呢?

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-5-22 00:53:00 | 显示全部楼层

Re: Re:hmhm的D3D白痴问题一罗筐

hmhm: Re:hmhm的D3D白痴问题一罗筐

感谢老孩子的回复。
如果调用SetXXX(NULL,xxx)来释放硬件资源的话,应该是在什么时候做呢?是在切换数据流的时候?还是应该在别的时候呢?

切换时没这个必要。最简单的,MS的D3D sample都没这么做。
如果你要是不放心,那就在程序结束前这么做吧(其实我觉得这么做也没什么必要,因为VB,IB本身建立就是硬件相关的,我认为没有理由在它release后还占用硬件资源)
唯一一点需要注意的就是有时这种操作是为了转换渲染状态。比如shader的情况,假设在渲染第一组material时使用了一组vertex/pixel shader,而在第二组时不准备使用pixel shader,则需要设置SetPixelShader(Null)。这个设置在这里起到的作用就是转换渲染状态。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 16:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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