2016-05-29 33 views
1

Ich benutze Effect Framework in meiner Demo.Kann den ID3DX11Effect-Zeiger nicht freigeben?

hier sind meine defination in Header-Datei

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

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

ich sie freisetzen, wie

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

dann folgen betreibe ich die Demo, wenn ich die Demo-Fenster zu schließen, gibt es ein Fehler, was bedeutet, dass HillsDemo nicht mehr funktioniert.Warum? Dann lösche ich die Zeile if (m_pFx) m_pFx->Release();, es gibt keinen Fehler. Also ist die Freigabe der m_pFx den Fehler machen?

ich die Dokumente von Effect11 sehen https://github.com/Microsoft/FX11/wiki/Effects-11, gibt es auf dem Dokument:

Folgende Typen werden nun von IUnknown abgeleitet: ID3DX11EffectType, ID3DX11EffectVariable, I3DX11EffectPass, ID3DX11EffectTechnique, ID3DX11EffectGroup. Beachten Sie, dass diese Objekte den standardmäßigen COM-Referenzzählregeln nicht folgen und dass sie freigegeben werden, wenn der übergeordnete ID3DX11Effect freigegeben wird. Dies dient hauptsächlich dazu, die Verwendung von Effects 11 aus verwalteten Sprachen zu vereinfachen.

Bedeutet es, dass ich nur die m_pFx freigeben sollte anstatt beide m_pFx und m_pTechnique freizugeben? Irgendwelche Ideen?

Antwort

2

Ich nehme an, dass Sie die neueste Version von Effects 11 von GitHub anstelle der alten DirectX SDK-Kopie basierend auf Ihrer Referenz auf das Projekt-Wiki verwenden.

Sie sollten wirklich mit ComPtr statt roher Zeiger auf COM-Objekte aussehen. Im Fall von Effects 11 würden Sie sie einfach für ID3DX11Effect Instanzen verwenden. Sie sollten mit "rohe Zeiger" für ID3DX11EffectType, ID3DX11EffectVariable, I3DX11EffectPass, ID3DX11EffectTechnique und ID3DX11EffectGroup bleiben. Stören Sie nicht Release auf diesen rohen Zeigern als die Lebensdauer, die durch die ID3DX11Effect gesteuert wird.

Etwas wie:

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; 
} 
+0

danke, ist kein Fehler, wenn ich ComPtr verwenden. Aber wenn ich einen rohen Zeiger verwende, ist das Problem immer noch nicht gelöst, solange ich den m_pFx freigebe. Es ist so verwirrend. – zhangbaochong

+0

Sie müssen zeigen, wie Sie die '' m_pFx'' erstellt –

+0

Ich verwende einfach die 'D3DX11CompileEffectFromFile' -Funktion, genau so: hr = D3DX11CompileEffectFromFile (L" color.fx ", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, ShaderFlags, 0, m_pd3dDevice, & m_pFx , & errorBlob); ,ist es falsch? – zhangbaochong