关于SetTexture()调用引起显存泄露的问题

项目中遇到一个问题,添加了GPU特技后,播放多次就会出现申请显存失败的问题,并且使用GPU-Z查看显存,也是在不断增加,于是断定是由于显存泄露造成的,仔细检查代码,发现在调用LPDIRECT3DTEXTURE9的Release时,返回值为1而不是0,这样的话实际上DX并没有真正释放显存,而只是将其引用计数减一,结果造成了显存泄露。问题在于DX的文档中只是说明了在调用LPDIRECT3DTEXTURE9的GetSurfaceLevel()接口时会增加引用计数,实际中我的代码在做GPU特技中并没用调用该接口,最后实在没办法只能使用AddRef()接口一点一点定位,结果发现SetTexture()调用也会增加引用计数。但是在DX的文档中并没有明确指出该调用会增加引用计数。但是在DX的在线文档中有如下描述:

Note  The IDirect3DDevice9::SetTexture method increments the reference count of the texture surface being assigned. When the texture is no longer needed, you should set the texture at the appropriate stage to NULL. If you fail to do this, the surface will not be released, resulting in a memory leak.、

确认了是由于该函数调用引起的,于是在做完特技后使用NULL调用SetTexture()就可了。问题解决,下面给出一段测试demo,该代码也是之前边缘检测的代码,可以在创建资源时通过GPU-Z查看显存占用,在RenderScreen()中分别注释和放开g_pEffect->SetTexture(hTexScreen, NULL);这段代码,然后在release中再次查看其显存占用是否会减少。这里又做了一个实验,是不是必须使用NULL指针来调用SetTexture()才能将引用计数减一,实验结果是可以的,不过建议最好使用NULL,大家可以使用g_pEffect->SetTexture(hTexScreen, g_pTextureScreen1);来代替NULL试验一下。

————————————————
版权声明:本文为CSDN博主「rabbit729」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rabbit729/article/details/8614995

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值