4

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

如果您删除说

cgD3D11SetTextureParameter( g.theTexture, g.sharedTex ) ;

泄漏停止。

CG 3.0真的会泄露吗?

使用 ATI Radeon 5850 GPU / Windows 7 64 位。

4

3 回答 3

3

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

大约 6 个月前,我在 nvidia 论坛上发布了有关此内容的信息,但从未得到回复

您的报告是否公开发布?还是某种私人支持票?

于 2011-12-29T05:52:07.633 回答
1

是的,每次调用 cgD3D11SetTextureParameter() 时 Cg 3.0 都会泄漏,导致应用程序的内存使用量攀升。不幸的是,它使带有 D3D11 的 Cg 3.0 完全无法使用。这种情况的一个症状是,在您的应用程序运行一段时间后,它将停止渲染并且屏幕将变黑。在发现 Cg 错误之前,我浪费了很多时间试图确定其原因。

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

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

于 2013-05-30T09:31:27.433 回答
-1

jmp [更新] ;; 跳过过时的文本段

会不会是 Cg 在 d3d 之后被销毁所以它没有按时释放参考?或相反亦然?例如获取纹理但在 d3d 关闭之前不释放它的函数,因为当您将纹理设置为着色器时,会获取纹理,直到以某种方式释放着色器资源。您正在破坏 d3d 上下文,这里: SAFE_RELEASE( g.d3d ); 安全释放(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 错误(基于...什么?)当然,如果您如此确定,如果代码没问题,为什么有人会看代码?不是顺便说一句,不是我不喜欢它,而是......也可能会认为,如果我只是查看 Main 并发现了一个错误,那么渲染调用和 Cg 实现还有很长的路要走,不是吗?我可以'

所以......当你的代码没有任何错误时......哦!看!我刚刚发现的..

~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 特别是因为我可能是对的,其他人会避免在页面显示后立即阅读您的代码。

于 2011-09-24T17:31:58.800 回答