我正在使用directx11和directxtk编码2D游戏。
我做了一个类框架,该框架初始化了为游戏显示的窗口和初始化Directx。这些初始化正常工作。然后,我决定在窗口中绘制一些背景等,但是过了一段时间后,它出于例外而退出。我尝试了一个尝试{...} catch(){}块,它告诉我"纹理不能无效"。但是,我找不到它在谈论哪种纹理,即使通过删除和检查所有值。
我决定将我在窗口中绘制的不同元素分开,以查看问题可能来自何处...所以现在我有3种绘制方法:
Draw(DWORD &elapsedTime);
DrawBackground(DWORD &elapsedTime);
DrawCharacter(DWORD &elapsedTime);
draw(dword& elapsedtime)方法调用dabbackground()和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);
}
通过调试,我几乎可以确定该异常来自缺点()和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);
}
因此,一旦我删除此方法(或任何遵循相同步骤的drawcharcter()),窗口会显示我期望的几秒钟,但随后我得到了例外的"纹理不能为null"。我还注意到,方法drawcharacter()让窗口显示我想要的内容比方法缩写()(),其纹理比角色的纹理大。
我不确定此信息是否有用,但是我认为这可能与纹理的大小相关联?
您会注意到我在此代码中做错了什么?为什么在显示一段时间时会将纹理视为null?我一直在寻找答案,已经有几个小时了,请提供一些帮助!谢谢
我注意到您创建了两个新的ID3D11shaderResourceView,而无需释放旧的ITERITION。您可以尝试仅创建ShaderResourceViews一次,然后将它们存储为全局变量,也可以在Sprites-> draw(...)调用之后尝试 -> Release()它们。