반응형

BLOG main image



GetSurfaceLevel()

GetRenderTarget(),
GetDepthStencilSurface()


을 사용할때 레퍼런스 카운트 1씩이 증가해 Release() 로 참조카운트 수를 감소시켜 해제하도록 해야함







http://cretom.egloos.com/583755

셰이더 책에 보면

보관했던 렌더링 표면을 복구시키는 부분에 이런 코드가 있다



//-----------------------------------------------------
// 기존 렌더링타겟 복구
//-----------------------------------------------------

m_pd3dDevice->SetRenderTarget(0, pOldBackBuffer);
m_pd3dDevice->SetDepthStencilSurface(pOldZBuffer);
m_pd3dDevice->SetViewport(&oldViewport);

pOldBackBuffer->Release();
pOldZBuffer->Release();


// 버퍼 클리어
m_pd3dDevice->Clear( 0L, NULL , D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER
      , 0x00404080, 1.0f, 0L );

// pOldBackBuffer에 렌더링하는 코드
.......
....
..




빨간색 부분이 주목해야 할 부분!

그 코드 뒤 복구한 렌더링타겟 'pOldBackBuffer' 에 Clear하고 렌더링하는 코드가 있는데

그러기 전 'pOldBackBuffer'를 Release 시켜버리고 있다.

왜 이러나.. 이해가 되질 않았는데

pDevice->GetRenderTarget(),
pDevice->GetDepthStencilSurface() 메소드의 설명을 찾아보니 의문이 풀렸다.




이 메서드를 호출하면,IDirect3DSurface9 인터페이스에 대한
내부 참조 카운트가 증가한다.
 IDirect3DSurface9 인터페이스를 사용해 끝냈을 때에
IUnknown::Release 를 호출하지 않으면 메모리 누수가 발생한다.


그러니까 스마트 포인터처럼 Get 메소드를 사용하면 내부 참조카운트가 증가하고,

내부 참조 카운트가 0일때 Release하면 최종적으로 메모리에서 내려가는 구조라서

메모리에서 해제시키려고 Release를 호출한 게 아니라,

GetRenderTarget() 호출로 +1 됐던 참조 카운트를

-1 시키려고 Release()를 호출했던거였다.








반응형

+ Recent posts