我发现CG似乎有一个内存泄漏。我通过nvidia.com提交了一份报告,但是如果你尝试这个here
如果你去掉下面这行
cgD3D11SetTextureParameter( g.theTexture, g.sharedTex ) ;泄漏就会停止。
CG 3.0真的会泄露吗?
使用ATI Radeon 5850 GPU / Windows 7 64位。
发布于 2011-12-29 13:52:08
是的,漏水了。在内部,它在每次调用时都会创建一个ShaderResourceView,并且永远不会释放它。我认为API的设计很糟糕,他们应该将ShaderResourceView*作为此函数的参数,而不仅仅是Resource*。
大约6个月前,我在nvidia论坛上发布了这一信息,但从未得到回应
你的报告是公开发布的吗?或者是某种私人支持票?
发布于 2013-05-30 17:31:27
是的,每次调用cgD3D11SetTextureParameter()时,CG3.0都会泄漏,导致应用程序的内存使用量攀升。不幸的是,它使得带有D3D11的CG3.0完全不可用。这种情况的一个症状是,在你的应用程序运行一段时间后,它将停止渲染,屏幕将变黑。在发现Cg bug之前,我浪费了很多时间来确定原因。
如果有人想知道为什么这在Cg D3D11演示中不明显,那是因为少数实际使用纹理的人非常简单,他们可以在一开始只调用一次cgD3D11SetTextureParameter()就可以逃脱惩罚。
同样的错误仍然存在于Cg Toolkit 3.1 (2012年4月)。
发布于 2011-09-25 01:31:59
jmp更新;;跳过过时的文本段
会不会是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错误(基于...什么?)当然,如果你这么确定,如果代码没问题,为什么还会有人看代码呢?不是顺便说一句,不是我不喜欢,而是...它有一些小东西,比如调用顺序,这些都是愚蠢的错误,但这会让调试变得非常糟糕,这是一个明显的错误,我可能还会想,如果我只是查看Main,发现了一个错误,那么渲染调用和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特别是因为我可能是对的,而且其他人会避免在页面显示时立即阅读您的代码。
https://stackoverflow.com/questions/7459040
复制相似问题