不能释放 ID3DX11Effect 指针?
Can't release the ID3DX11Effect pointer?
我在演示中使用 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();
}
然后我运行演示,当我关闭演示window时,出现一个错误,这意味着HillsDemo已经停止working.Why?然后我删除了行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_pFx
和 m_pTechnique
?有什么想法吗?
根据您对项目 wiki 的引用,我假设您使用的是来自 GitHub 的最新版本的 Effects 11,而不是旧的 DirectX SDK 副本。
您真的应该考虑使用 ComPtr 而不是指向 COM 对象的原始指针。对于 Effects 11,您只需将它们用于 ID3DX11Effect
个实例。对于 ID3DX11EffectType
、ID3DX11EffectVariable
、I3DX11EffectPass
、ID3DX11EffectTechnique
和 ID3DX11EffectGroup
,您应该坚持使用 'raw pointers'。不要费心在这些原始指针上调用 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;
}
我在演示中使用 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();
}
然后我运行演示,当我关闭演示window时,出现一个错误,这意味着HillsDemo已经停止working.Why?然后我删除了行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_pFx
和 m_pTechnique
?有什么想法吗?
根据您对项目 wiki 的引用,我假设您使用的是来自 GitHub 的最新版本的 Effects 11,而不是旧的 DirectX SDK 副本。
您真的应该考虑使用 ComPtr 而不是指向 COM 对象的原始指针。对于 Effects 11,您只需将它们用于 ID3DX11Effect
个实例。对于 ID3DX11EffectType
、ID3DX11EffectVariable
、I3DX11EffectPass
、ID3DX11EffectTechnique
和 ID3DX11EffectGroup
,您应该坚持使用 'raw pointers'。不要费心在这些原始指针上调用 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;
}