2017-01-08 4 views
0

DirectX api(AMDのドライバ)に問題が見つかりました。 インクリメンタルサイズのcreateBuffer()を使用してd3dバッファを作成し、forループでそれをリリースすると、メモリ診断ツールはプロセスのプライベートバイトサイズが絶えず増加していることを示します。私は、GPUマップされたシステムメモリが決して解放されないためかもしれないと思う。ところで、CPUのヒープサイズは安定しています。さまざまなサイズのd3dBufferがリリースされていません

  1. 千反復バッファサイズは1000に1キロバイトから始まりFOR MB
  2. CreateBuffer D3D11_USAGE_STAGING/D3D11_USAGE_DYNAMIC & D3D11_CPU_ACCESS_WRITE
  3. d3dbuffer.Release & d3dbuffer = nullptr
  4. コンテキストを使用して。 cleastate()とフラッシュは()同期解放する
for (unsigned long long totalSize = 1MB; totalSize <= 1000MB ; totalSize += 1MB) 
{ 
    // create 
    CComPtr<ID3D11Buffer> pd3dBuffer; 
    D3D11_BUFFER_DESC bufferDesc; 
    { 
     ZeroMemory(&bufferDesc, sizeof(bufferDesc)); 
     bufferDesc.ByteWidth = static_cast<UINT>(bufferSize); 
     bufferDesc.Usage = D3D11_USAGE_DYNAMIC; 
     bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
     bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
     bufferDesc.MiscFlags = 0; 
     bufferDesc.StructureByteStride = 0; 
    } 
    HRESULT hr = pd3dDevice->CreateBuffer(&bufferDesc, NULL, pd3dBuffer); 
    if (FAILED(hr)) break; 

    //release 
    pd3dBuffer.Release(); 
    pd3dDeviceContext->ClearState(); 
    pd3dDeviceContext->Flush(); 

} 

d3dbufferプロセスのメモリ使用量が上がり続け、最終的に私の物理メモリの16ギガバイトの制限やクラッシュに達しているため。これは、作成直後にバッファを同期的に解放するため、変です。プロセスメモリの使用率は比較的安定している必要があります。 ダイレクトメモリ管理がどのように機能しないのか説明できる人はいますか?

+0

待つ私は文書を見てみる –

+0

マッピング後にバッファのマッピングも解除されていますか? –

+0

マッピングのマッピングが解除されていません。同期削除(遅延なし)を作成するだけです。 – shorttermmem

答えて

0

調査の結果、この奇妙な動作はDirectXの実装によって引き起こされました。基本的に、OS企業としてのMicrosoftは、DirectX APIのインターフェイス/仕様のみを定義しています。サードパーティのGPUベンダーは、これらのAPIの独自の実装を提供する必要があります。

Nvidiaは1つを提供しますが、AMDが突然、DirectXをサポートしたい場合は、1つも書いてください。

バッファ割り当ておよび解放メカニズムは、DirectX仕様では完全に定義されていないため、最適なメモリ管理アルゴリズムを提供するのはベンダーによって異なります。リリースされたメモリハンドルをリサイクルしないようにベンダの実装にバグがあるため、このバグの原因となるバッファに関連付けられたシステムコミットメモリは解放されません。

関連する問題