无法释放ID3DX11Effect指针?

时间:2016-05-29 11:07:49

标签: graphics directx directx-11 direct3d direct3d11

我在演示中使用了Effect框架。

这是我在头文件中的定义

    ID3D11Buffer*                   m_pVertexBuffer;
    ID3D11Buffer*                   m_pIndexBuffer;
    ID3D11InputLayout*              m_pInputLayout;

    ID3DX11Effect*                  m_pFx;
    ID3DX11EffectTechnique*         m_pTechnique;
    ID3DX11EffectMatrixVariable*    m_pFxWorldViewProj;

我将其发布如下

void HillsDemo::UnLoadContent()
{
    if (m_pVertexBuffer) m_pVertexBuffer->Release();
    if (m_pIndexBuffer) m_pIndexBuffer->Release();
    if (m_pInputLayout) m_pInputLayout->Release();
    if (m_pTechnique) m_pTechnique->Release();
    if (m_pFx) m_pFx->Release();
}

error picture

然后我运行演示,当我关闭演示窗口时,出现错误,这意味着HillsDemo已经停止工作。为什么?然后我删除了行if (m_pFx) m_pFx->Release();,没有错误。那么发布m_pFx会出错吗?

我查看Effect11 https://github.com/Microsoft/FX11/wiki/Effects-11的文件,文件上有:

以下类型现在派生自IUnknown:ID3DX11EffectType,ID3DX11EffectVariable,I3DX11EffectPass,ID3DX11EffectTechnique,ID3DX11EffectGroup。请注意,这些对象不遵循标准的COM引用计数规则,并且在释放父ID3DX11Effect时会释放它们。这主要是为了简化来自托管语言的Effects 11的使用。

这是否意味着我应该只发布m_pFx而不是同时发布m_pFxm_pTechnique?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我假设您使用的是GitHub中最新版本的Effects 11,而不是基于您对项目Wiki的引用的旧版DirectX SDK副本。

您应该真正使用ComPtr而不是COM对象的原始指针。在Effects 11的情况下,您只需将它们用于ID3DX11Effect个实例。您应该坚持使用ID3DX11EffectTypeID3DX11EffectVariableI3DX11EffectPassID3DX11EffectTechniqueID3DX11EffectGroup的“原始指针”。不要在这些原始指针上调用Release作为由ID3DX11Effect控制的生命周期。

类似的东西:

Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVertexBuffer;
Microsoft::WRL::ComPtr<ID3D11Buffer> m_pIndexBuffer;
Microsoft::WRL::ComPtr<ID3D11InputLayout> m_pInputLayout;

Microsoft::WRL::ComPtr<ID3DX11Effect> m_pFx;
ID3DX11EffectTechnique* m_pTechnique;
ID3DX11EffectMatrixVariable* m_pFxWorldViewProj;

void HillsDemo::UnLoadContent()
{
    m_pVertexBuffer.Reset();
    m_pIndexBuffer.Reset();
    m_pInputLayout.Reset();
    m_pFx.Reset();
    m_pTechnique = nullptr;
    pFxWorldViewProj = nullptr;
}