저는 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로 간주되는 이유는 무엇입니까? 나는 지금 몇 시간 동안 응답을 찾고 있었고, 어떤 도움은 놀라 울 것입니다! 고맙습니다.
감사합니다. 나는 우리가 텍스쳐를 항상 로딩하고 있었기 때문에 그것을 발견했다는 편집을하려고했는데, 그 이유 때문에 우리는 그 때문에 시스템의 메모리를 초과하기 때문에 오류가 발생했습니다. 텍스처를 전역 변수로 설정하려고했는데 현재 작동합니다. 도움을 주셔서 감사합니다! –
도움이되어 기쁩니다. ID3D11ShaderResourceView 및 다른 COM 개체를 아직 릴리스하지 않았 으면 응용 프로그램이 종료 될 때 릴리스하도록 알려줄 수 있습니까? [이 섹션의 COM on msdn] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff637359(v=vs.85) .aspx)을 읽어야하는 이유를 모르면 . –