2017-01-08 10 views
0

DirectX API (AMD의 드라이버)에 문제가 있음을 확인했습니다. 증분 크기로 createBuffer()를 사용하여 d3d 버퍼를 만들고 for 루프에서 릴리스하면 메모리 진단 도구는 프로세스의 개인 바이트 크기가 계속 증가하고 있음을 보여줍니다. GPU 맵핑 된 시스템 메모리가 절대로 릴리즈되지 않기 때문일 수도 있습니다. BTW, CPU 힙 크기가 안정적입니다. 1,000 반복 버퍼 크기다양한 크기의 d3dBuffer가 만들어지지 않았습니다.

  1. 가 MB
  2. CreateBuffer가 D3D11_USAGE_STAGING를 사용하여 1000 1킬로바이트 시작/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 기가 바이트 제한과 충돌에 도달하기 때문에. 이것은 생성 직후 버퍼를 동기식으로 해제하므로 이상합니다. 프로세스 메모리 사용은 비교적 안정적이어야합니다. DirectX 메모리 관리가 어떻게 작동하지 않는지 설명 할 수있는 사람이 있습니까?

+0

잠깐 나는 문서를 살펴볼 것이다 –

+0

버퍼를 맵핑 한 후에 맵핑 해제 중입니까? –

+0

매핑 매핑 매핑이 없습니다. 그냥 동기화 삭제 (지연되지 않음). – shorttermmem

답변

0

몇 가지 조사가 끝난 후이 이상한 동작은 DirectX 구현으로 인해 발생했습니다. 기본적으로 OS 회사 인 Microsoft는 DirectX API에 대한 인터페이스/사양 만 정의하며 타사 GPU 공급 업체는 이러한 API의 자체 구현을 제공해야합니다.

Nvidia는 하나를 제공하고, AMD는 갑자기 Qualcomm이 DirectX를 지원하기를 원한다면 하나를 제공해야합니다.

버퍼 할당 및 해제 메커니즘은 DirectX 사양에서 완전히 정의되지 않았으므로 최적의 메모리 관리 알고리즘을 제공하는 것은 공급 업체의 책임입니다. 릴리스 된 메모리 핸들을 재활용하지 않는 공급 업체의 구현에 버그가 있기 때문에 버퍼와 관련된 시스템 커밋 된 메모리가 해제되지 않아이 버그가 발생합니다.