2

そのため、私は自分のレンダリングエンジンで作業していて、奇妙なメモリ動作に遭遇しました。

私が電話するときはいつでも

IDXGISwapChain::Present(0, 0) 

そのフレームをレンダリングした頂点のサイズだけ、プログラムのメモリ使用量が増加します。

このコードを使用して頂点バッファーを作成します。

ID3D10Buffer        *pVertexBuffer;
D3D10_BUFFER_DESC   desc;
desc.Usage          = D3D10_USAGE_DYNAMIC;
desc.ByteWidth      = stride * nNumVertices;
desc.BindFlags      = D3D10_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
desc.MiscFlags      = 0;
D3D10_SUBRESOURCE_DATA vData;
vData.pSysMem       = Vertices;

HRESULT hr = m_pDevice->CreateBuffer(&desc, &vData, &pVertexBuffer); 

を使用して描画します

m_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_pDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset);


m_pDevice->Draw(nNumVertices, 0);

そしてそれを解放します

pVertexBuffer->Release();

これはエラーをスローします

D3D10 INFO: ID3D10Device::IASetVertexBuffers: A currently bound VertexBuffer is being deleted; so naturally, will no longer be bound. [ STATE_SETTING INFO #31: IASETVERTEXBUFFERS_UNBINDDELETINGOBJECT]

しかし、MSDNやその他の質問によると、これは問題にはならないはずです。

他の誰かがこれを以前に経験したことがありますか、または私に助けを与えることができますか?

編集1:

これは、メモリの使用を停止した後、特定の回数、約500回発生します。次にメッシュをアンロードしてリロードすると(ポインターが異なるため)、present()はメッシュのサイズであるメモリの割り当てを約500回開始します。これは、プログラムのメモリがなくなるまで続きます。

追加することの1つは、Present()を初めて呼び出すときに、バインドしたテクスチャのサイズだけ使用メモリを増やします。これには、バックバッファが含まれます。

4

1 に答える 1

0

多くの実験の後、私はここで何が起こっているのかを見つけました。ID3D10Bufferを使用して が作成されるたびに、CreateBuffer()4IDXGISwapChain::Present()キロバイトが割り当てられます。私の場合、これは同一のバッファごとに 64 回発生し、停止するか、以前に割り当てられたメモリを解放します。

これが、この文書化されていない「機能」で他の誰かに役立つことを願っています

于 2013-04-01T08:46:03.610 に答える