Does CG 3.0 leak?



我发现CG似乎有内存泄漏。我通过nvidia.com提交了一份报告,但如果你在这里尝试:

如果你去掉

这一行
cgD3D11SetTextureParameter( g.theTexture, g.sharedTex ) ;

泄漏停止

CG 3.0真的有漏洞吗?

使用ATI Radeon 5850 GPU/Windows 7 64位

是的,它会泄漏。在内部,它会在每次调用时创建一个ShaderResourceView,并且永远不会释放它。我认为这个API设计得很糟糕,他们应该把ShaderResourceView*作为这个函数的参数,而不仅仅是一个Resource*。

我大约6个月前在nvidia论坛上发布了这个问题,从来没有得到回应

你的报告公开发布了吗?还是某种私人支持票?

是的,Cg 3.0泄漏每次你调用cgD3D11SetTextureParameter(),导致你的应用程序的内存使用攀升。不幸的是,它使Cg 3.0与D3D11完全无法使用。这种情况的一个症状是,在你的应用程序运行了一段时间后,它会停止渲染,屏幕会变黑。在发现Cg漏洞之前,我浪费了很多时间来确定这个问题的原因。

如果有人想知道为什么这在Cg D3D11演示中不明显,这是因为少数实际使用纹理的人是如此简单,以至于他们可以在开始时只调用cgD3D11SetTextureParameter()一次。

同样的错误仍然存在于Cg Toolkit 3.1(2012年4月)。

jmp [UPDATE];跳过废弃文本段

可能是Cg在d3d之后被破坏了,所以它没有及时释放参考?反之亦然?例如,函数获取纹理,但在d3d关闭之前不释放它,因为当你将纹理设置为着色器时,纹理被获取,直到着色器资源以某种方式释放。你正在破坏d3d上下文,在这里:SAFE_RELEASE(g.d3d);SAFE_RELEASE(g.gpu);稍后,你释放着色器,如下CleanupCg()所示:cgDestroyProgram(g.v_vncShader);checkForCgError("销毁顶点程序");cgDestroyProgram(g.px_vncShader);checkForCgError("销毁片段程序");尝试改变调用的顺序,首先释放cg和d3d的所有资源,这:cgD3D11SetDevice( g.cgContext, NULL );也应该在释放d3d上下文之前被调用,以防万一。

更新:

WinMain()中应该是不同的:

initD3D11() ;  // << FIRST you init D3D
initCg() ;     // << SECOND you init CG with the D3D pointers
initD2D1() ;   // 
initVBs() ;
// Main message loop    
while( WM_QUIT != msg.message ){ /* loop code */ }
CleanupDevice();   //// << FIRST you release all D3D, when Cg is still referencing it (why?). 
CleanupCg();       //// << SECOND if something in the Cg runtime depend on d3dcontext which you just destroyed, it will crash or leak or do whatever it wants

所以你应该交换它们,以确保Cg释放任何d3d指针:

CleanupCg();       //// << FIRST release Cg to ensure it's not referencing D3D anymore. 
CleanupDevice();   //// << SECOND D3D isn't either referencing or being referenced by Cg, so just release it all

你也可以提供调试器输出和其他信息,因为你基本上是在说"Cg似乎坏了,这是整个代码,看看这行###,它坏了吗?"但是在你的文件中有超过一千行(1012)的C, c++和着色器代码,你基本上没有提供任何信息,但很容易指出Cg错误(基于…什么?)当然,如果你这么肯定,为什么要看代码,如果代码是好的?顺便说一下,不是我不喜欢,但是……它有一些小东西,比如调用顺序,这些都是愚蠢的错误,但这可以使调试成为一个真正的地狱,这是一个明显的bug,我也可能认为,如果我只是查看Main并发现一个bug,那么还有很长的路要走到渲染调用和Cg实现,不是吗?我不能在WinXP上运行应用程序,但这些错误是在最可预测的地方:)

所以…当你的代码没有任何bug时……哦!看!我刚刚发现……

~VertexBuffer()
{
  SAFE_RELEASE( vb );
  SAFE_RELEASE( layout ) ;
}

在VertexBuffer构造函数中,您调用iD3D->GetImmediateContext( &gpu );并将指针存储在私有成员中,因此…你不应该加上:

SAFE_RELEASE( gpu ); // ? there are 3 VertexBuffers instances, so that's another memory leak.

好的,所以有一些事情你应该在你的代码中修复,导致内存泄漏,我只是看了看,所以你没有真正尝试。另一方面,你的代码看起来很清晰,解释也很充分,我需要学习一些DX11,所以实际上我应该感谢你。但是,拒绝投票有些粗鲁:P,特别是因为我可能是对的,而且其他人会在页面显示后立即避免阅读您的代码。

相关内容

  • 没有找到相关文章

最新更新