2017-12-29 107 views
0

저는 DirectX11과 DirectXTK를 사용하여 2D 게임을 코딩하고 있습니다.예외 "텍스처가 null이 될 수 없습니다"직접 X

게임용으로 표시된 창을 초기화하고 DirectX를 초기화하는 클래스 프레임 워크를 만들었습니다. 이러한 초기화는 올바르게 작동합니다. 그런 다음 창에 배경 등을 그리기로 결정했지만 잠시 후 예외가 발생합니다. 나는 try {...} catch() {} 블록을했는데, "Texture는 null이 될 수 없다"는 것을 알려줍니다. 그러나, 나는 debbugging하고 모든 값을 확인하여 이야기하는 텍스처를 찾을 수 없습니다.

나는 ... 문제가에서 올 수도 곳을보고, 나는 창에 그림 된 다른 요소를 분리하기로 결정 그래서 지금은 3 개 무승부 방법이 있습니다

Draw(DWORD &elapsedTime); 
DrawBackground(DWORD &elapsedTime); 
DrawCharacter(DWORD &elapsedTime); 

그리기 (DWORD & elapsedTime을) 메서드는 DrawBackground() 및 DrawCharacter() 메서드를 모두 호출합니다.

void Framework::Draw(DWORD * elapsedTime) 
{ 
    // Clearing the Back Buffer 
    immediateContext->ClearRenderTargetView(renderTargetView, Colors::Aquamarine); 

    //Clearing the depth buffer to max depth (1.0) 
    immediateContext->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); //immediateContext is a ID3D11DeviceContext* 

    CommonStates states(d3dDevice); //d3dDevice is a ID3D11Device* 

    sprites.reset(new SpriteBatch(immediateContext)); 


    sprites->Begin(SpriteSortMode_Deferred, states.NonPremultiplied()); 

    DrawBackground1(elapsedTime); 
    DrawCharacter(elapsedTime); 

    sprites->End(); 


    //Presenting the back buffer to the front buffer 
    swapChain->Present(0, 0); 
} 

내가 예외가 DrawBackground()와 DrawCharacter 모두에서 오는 것을 거의 확신 디버깅으로() :

여기 내 그리기 방법이다. 사실, Draw 메서드의 주석에 주석을 달았을 때 아무런 오류가 없지만 몇 초 후에 원하는 것을 표시 한 후에 예외를 설정하자마자 오류가 발생합니다. 여기

예를 들어 메소드 DrawBackground()이다 : 그래서 최대한 빨리이 방법 (또는 같은 단계에 따라 어떤 DrawCharacter을())의 주석으로

void Framework::DrawBackground1(DWORD * elpasedTime) 
{ 
    RECT *try1 = new RECT(); 
    try1->bottom = 0; try1->left = 0; try1->right = (int)WIDTH; try1->bottom = (int)HEIGHT; 


    ID3D11ShaderResourceView * texture2 = nullptr; 
    ID3D11ShaderResourceView * textureRV = nullptr; 

    CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set2_background.dds", nullptr, &textureRV); 
    CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set3_tiles.dds", nullptr, &texture2); 

    sprites->Draw(textureRV, XMFLOAT2(0, 0), try1, Colors::White); 
    sprites->Draw(texture2, XMFLOAT2(0, 0), try1, Colors::CornflowerBlue); 
} 

창은 내가 그것을 기대 표시 몇 초 동안, 그런 다음 예외가 발생합니다. "질감은 null이 될 수 없습니다." 나는 또한 DrawCharacter() 메소드가 윈도우가 내가 원하는 것보다 더 오래 원하는 것을 표시 할 수있게 해준다. DrawBackground()는 문자의 길이보다 텍스처가 더 크다.

이 정보가 유용할지 모르겠지만 텍스쳐의 크기와 관련이있을 수 있습니다.

이 코드에서 잘못된 점을 발견 했습니까? 텍스처가 잠시 동안 표시되는 동안 텍스처가 null로 간주되는 이유는 무엇입니까? 나는 지금 몇 시간 동안 응답을 찾고 있었고, 어떤 도움은 놀라 울 것입니다! 고맙습니다.

답변

2

이전 IDSD11ShaderResourceView를 새로 만들 때마다 이전 버전을 릴리스하지 않고 나타났습니다. ShaderResourceViews를 한 번만 생성하고 전역 변수로 저장하거나 스프라이트 -> 그리기 (...) 호출 후 -> Release()를 시도해 볼 수 있습니다.

+1

감사합니다. 나는 우리가 텍스쳐를 항상 로딩하고 있었기 때문에 그것을 발견했다는 편집을하려고했는데, 그 이유 때문에 우리는 그 때문에 시스템의 메모리를 초과하기 때문에 오류가 발생했습니다. 텍스처를 전역 변수로 설정하려고했는데 현재 작동합니다. 도움을 주셔서 감사합니다! –

+1

도움이되어 기쁩니다. ID3D11ShaderResourceView 및 다른 COM 개체를 아직 릴리스하지 않았 으면 응용 프로그램이 종료 될 때 릴리스하도록 알려줄 수 있습니까? [이 섹션의 COM on msdn] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff637359(v=vs.85) .aspx)을 읽어야하는 이유를 모르면 . –