2011-09-18 3 views
4

CGがメモリリークを起こしているようです。私はnvidia.comを経由して報告書を提出しますが、このhereしよう:あなたはCG 3.0はリークしますか?

cgD3D11SetTextureParameter(g.theTexture, g.sharedTex) ; 

リークストップを言う行を削除する場合

を。

CG 3.0は本当にリークしますか?

ATI Radeon 5850 GPU/Windows 7 64ビットを使用する。

+1

Downvoter説明またはあなたのダウンローダーが削除されます! – bobobobo

答えて

3

はい、リークします。内部的には、すべての呼び出しでShaderResourceViewを作成し、それを解放しません。私は、APIがうまく設計されていないと思うので、ShaderResourceView *をResource *の代わりにこの関数のパラメータとして使用する必要があります。私は約6ヶ月前にNVIDIAフォーラムでこれについて掲示、決して応答

を得た

は、あなたのレポートが公に掲載されて?または何らかのプライベートサポートチケットですか?

-1

jmp [UPDATE] ;;廃止されたテキストセグメントをスキップする

d3dの後でCgが破棄されているため、参照を適時に解放しないことがありますか?またはその逆?テクスチャをシェーダに設定すると、シェーダリソースが何らかの方法で解放されるまでテクスチャが取得されるため、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コンテキストを解放する前に呼び出される必要があります。

UPDATE:

これは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 

ので、あなたがどんなD3Dポインタを解放するためのCgを確保するためにそれらを交換する必要があります

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は壊れているようだ彼は全体のコードです###ラインを見て、それは壊れていますか?あなたのファイルにはC、C++、シェーダコードの1000行以上(1012)がありますが、基本的に情報は提供しませんが、Cgのバグを指しています(何をベースにしていますか?コードがうまくいけば、なぜ誰かがコードを見ているのでしょうか?ところで、私はそれが気に入らないのではなく、...愚かな間違いだが、デバッグを本当の地獄にすることができるコールオーダーのような小さなものを持っています。それは明らかなバグです。私がMainを見てバグを発見した場合、レンダリングコールとCgの実装には長い道のりがあるのではないでしょうか?私はWinXP上でアプリケーションを実行することはできませんが、これらのエラーは最も予測可能な場所にあります:)

だから...あなたのコードは、任意のバグのクリーン...オハイオ州!見て!私はちょうど見つけたものを...

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

あなたがiD3D->GetImmediateContext(&gpu);を呼び出すので、プライベートメンバにポインタを格納VertexBufferコンストラクタで判明します...あなたは追加しないでください。

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

[OK]をそこにメモリリークを引き起こすあなたのコードに修正すべきいくつかのものがあり、私はそれを見ていたので、あなたが本当にしようとしなかったので。一方、あなたのコードははっきりと説明でいっぱいだと私はいくつかのDX11を学ぶ必要があるので、実際に私はそれに感謝する必要があります。 downvoteはやや失礼ですが、特に私が正しいと思うので、他の人がページが表示されるとすぐにコードを読まなくするでしょう。

+0

いいえ、これはランタイムのバグで、シャットダウンではありません(ATI 5850 gpuで約1MB/sのリークが発生します) – bobobobo

+0

@boboboboいつエラーが表示されますか?アプリを閉じるときやメインループを閉じるときそれはデバッグブレークまたは例外または何か?それは常に同じ量のメモリを報告しますか? –

+0

私はTaskManを見て、メモリ消費量が上がったり上がったりするのを見ているだけです。同一のマシン/ gpu上の同一タスクのHLSLシェーダを使用する同じプログラムは漏れません。 – bobobobo

1

はい、cgD3D11SetTextureParameter()を呼び出すたびにCg 3.0がリークし、アプリケーションのメモリ使用量が増加します。残念ながら、D3D11のCg 3.0は完全に使用できません。この現象の1つの症状は、アプリケーションの実行中にレンダリングが停止し、画面が黒くなることです。私はCgバグを発見する前に、この原因を突き止めるのに多くの時間を費やしました。

Cg D3D11のデモではなぜこれが明らかになっていないのか不思議な人は、実際にテクスチャを使用する少数の人が非常にシンプルで、開始時にcgD3D11SetTextureParameter()を呼び出すだけで済むので、

この同じバグはCg Toolkit 3.1(2012年4月)に残ります。

関連する問題