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 개월 전 대한 엔비디아 포럼에 이것에 대해 게시 및

보고서가 공개적으로 게시되어 응답을 가진 적이 없어? 아니면 어떤 종류의 개인 지원 티켓?

-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에서 모든 리소스를 먼저 해제하는 방식으로 통화 순서를 변경하십시오. 은 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 

또한 수 : 어떤 D3D 포인터를 무료로 CG로 보장을 교환해야하므로

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 

:

UPDATE : 다른 WinMain() 내부

이 있어야한다 기본적으로 "Cg가 깨져있는 것 같아서, 거기에서 물어 본 것처럼 디버거 출력과 기타 정보를 제공합니다. 그의 코드 전체가 ### 라인을 쳐다 보니 깨진 것입니까? " 하지만 파일에는 C, C++ 및 쉐이더 코드가 수천 줄 (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. 

가 메모리 누수의 원인이 코드에서 당신은 수정해야 몇 가지가 있습니다, 당신은 정말하지 않았다, 그래서 난 그냥, 그것에 살펴 보았다 확인 있도록. 다른 한편으로는, 당신의 코드가 명확하고 설명으로 가득 찬 것으로 보입니다. 그리고 나는 DX11을 배워야 할 필요가 있습니다. 그래서 실제로 그것에 대해 감사해야합니다. downvote 다소 무례 : P는 내가 옳은 아마 때문에, 그리고 다른 사람들이 귀하의 코드를 읽을 때 페이지가 표시되는 즉시 피할 것이다.

+0

아니요, 이것은 런타임 버그와 관련이 있습니다. 종료가 아닙니다 (ATI 5850 GPU에서 약 1MB/s의 누출이 발생 함) – bobobobo

+0

@bobobobo 언제 오류가 발생합니까? 앱을 종료 할 때 또는 메인 루프에있을 때? 그것은 디버그 - 휴식 또는 예외 또는 뭔가? 항상 동일한 양의 메모리를보고합니까? –

+0

저는 TaskMan을보고 메모리 소비량이 올라가고 올라가고 올라가는 것을 보았습니다. 동일한 작업 HLSL 쉐이더를 사용하는 동일한 시스템/gpu에있는 동일한 프로그램이 누출되지 않습니다. – bobobobo

1

예, cgD3D11SetTextureParameter()를 호출 할 때마다 Cg 3.0이 누수되어 응용 프로그램의 메모리 사용량이 상승합니다. 불행히도 Cg 3.0은 D3D11을 사용할 수 없게되었습니다. 이것의 한 가지 증상은 응용 프로그램을 실행 한 후 렌더링이 중지되고 화면이 검게 변하는 것입니다. 나는 Cg 버그를 발견하기 전에이 문제의 원인을 알아 내려고 많은 시간을 낭비했다.

Cg D3D11 데모에서는 왜 이것이 분명하지 않은지 궁금해하는 사람이 있습니다. 실제로 텍스처를 사용하는 소수가 너무 간단하기 때문에 시작시 한 번만 cgD3D11SetTextureParameter()를 호출하기 만하면됩니다.

Cg Toolkit 3.1 (2012 년 4 월)에도 이와 동일한 버그가 있습니다.

관련 문제