2017-12-29 76 views
0

私はDirectX11とDirectXTKを使用して2Dゲームをコーディングしています。例外「テクスチャはnullではありません」Direct X

ゲーム用に表示されたウィンドウを初期化し、DirectXを初期化するクラスフレームワークを作成しました。これらの初期化は正しく機能します。その後、ウィンドウにいくつかの背景などを描画することにしましたが、しばらくしてからは例外で終了します。私はtry {...} catch(){}ブロックを実行しました。これは "Textureはnullにはできません"ということです。しかし、すべての値をデバッグしてチェックしても、どのテクスチャについて話しているのかわかりませんでした。

私は今、私は3つのドロー方法持っているので...問題から来るかもしれない場所を確認するために、私は窓に描いていたさまざまな要素を分離することを決めた:DWORD &経過時間(

Draw(DWORD &elapsedTime); 
DrawBackground(DWORD &elapsedTime); 
DrawCharacter(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メソッドのそれらをコメントするとき、私はエラーはありませんが、私が1つを置くとすぐに、私は数秒間何をしたいかを表示した後に例外を設定します。ここで

は、例えば方法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

新しいID3D11ShaderResourceViewは、古いものを解放せずに2つずつ作成することに気付きました。 ShaderResourceViewsを一度しか作成せずにグローバル変数として保存するか、スプライト→描画(...)の呼び出し後にRelease()を試してみてください。

+1

ありがとうございます!私はいつもテクスチャをロードしていることがわかったという編集をしようとしていました。その理由のためにシステムのメモリを超えていたからです。私はテクスチャをグローバル変数として設定しようとしていましたが、今はうまくいきます。あなたの助けに感謝します! –

+1

私は役に立つとうれしいです。あなたのID3D11ShaderResourceViewと他のCOMオブジェクトをまだリリースしていない場合に終了するときに、そのIDオブジェクトを解放するよう通知することはできますか?なぜ[このセクションのCOM on msdn](https://msdn.microsoft.com/en-us/library/windows/desktop/ff637359(v=vs.85).aspx)を読むべきかわからない場合は、 。 –

関連する問題