0

私はdirectX APIを使ってプログラムを書いています。DXUTを使い始めました。directX デバイスの参照カウントを制御しようとすると問題が発生します。D3DXCreateMesh()、D3DXCreateTextureFromFile()、または IDirect3DDevice9::CreateVertexBuffer() を呼び出すたびに、参照がデバイスに追加されるようです。「SYSTEMMEM」フラグを使用して、新しく作成されたオブジェクト (メッシュ、テクスチャ、または頂点バッファー) をデバイスの割り当て内に格納するのではなく、システムのメモリに格納しようとしました。デバイスへの参照を追加した呼び出しの例を次に示します...

DWORD dwNumFaces = 1, dwNumVertices = 3, dwOptions |= D3DXMESH_SYSTEMMEM;

D3DVERTEXELEMENT9 mesh_decl
{
...
}

ID3DXMESH *pMesh = NULL;
D3DXCreateMesh(dwNumFaces, dwNumVertices, dwOptions, mesh_decl, m_pd3dDevice, &pMesh);

この問題に関するアイデアや情報へのリンクはありますか? これは予想されることですか?これまでの解決策は、上記の関数を呼び出すたびに直接デバイスを解放することでした (m_pd3dDevice->Release())。DXUT がデバイスを解放しようとすると、デバイスの参照カウントが 0 より大きいことを示すエラーがスローされます。

4

1 に答える 1

2

すべてのメッシュはデバイスに関連付けられています。デバイスは、少なくともメッシュと同じ期間存続する必要があります。

でメッシュを解放するとpMesh->Release()、最終解放時にメッシュが破壊されます。その場合、メッシュはRelease()デバイスを呼び出します。これにより、メッシュが存在する限り、デバイスが存在し続けることが保証されます。

これは、システムまたはデバイスのメモリが使用されているかどうかに関係なく、動作するはずの方法です。

メッシュは単なる三角形の集まりではありません。特定のデバイスで表示するために、事前に計算、微調整、キャッシュ、および最適化された三角形の集まりです。そのため、デバイスへの参照があります。これは、最適化されたデバイスです。それらを別のデバイスに移動することはできません。

結論:参照カウントは正しい参照カウントでなければなりません- それはオブジェクトへの参照の数でなければなりません。各メッシュにはオブジェクトへの参照があるため、メッシュを作成すると参照カウントが増加し、メッシュを破棄すると参照カウントが減少するのは正しいことです。

参照カウントを「制御」すると、結果として不正になり、悪いことが起こります。

于 2012-12-17T11:07:18.797 に答える