d3dBuffer创建的各种尺寸未发布

时间:2017-01-08 20:04:12

标签: memory-leaks directx gpu amd direct3d

我注意到DirectX api(来自AMD的驱动程序)存在问题。 如果我使用具有增量大小的createBuffer()创建d3d缓冲区并在for循环中释放它,则内存诊断工具会显示进程的私有字节大小不断增加。我想这可能是因为GPU映射的系统内存永远不会被释放。 BTW,cpu堆大小稳定。

  
      
  1. FOR 1000迭代缓冲区大小从1kb到1000 MB
  2. 开始   
  3. 使用CreateBuffer              D3D11_USAGE_STAGING / D3D11_USAGE_DYNAMIC              &安培; D3D11_CPU_ACCESS_WRITE
  4.   
  5. d3dbuffer.Release& d3dbuffer = nullptr
  6.   
  7. 上下文。 cleastate()和flush()同步释放d3dbuffer
  8.   
void setup() {
 Serial.begin(9600);
}

void loop() {
  Serial.print("Tick #");
  delay(1000);
}

因为进程内存使用率不断上升并最终达到我的物理内存16gb限制并崩溃。这很奇怪,因为我在创建后立即同步释放缓冲区。进程内存使用应该相对稳定。 有没有人可以解释一下directx内存管理是如何工作的?

1 个答案:

答案 0 :(得分:0)

经过一番调查后,这种奇怪的行为是由DirectX实现引起的。基本上,Microsoft作为OS公司只定义DirectX API的接口/规范,第三方GPU供应商必须提供这些API的自己的实现。

Nvidia将提供一个,AMD将提供一个,如果突然高通想要支持DirectX,它也必须写一个。

在DirectX规范中没有完全定义缓冲区分配和释放机制,因此供应商需要提供最佳的内存管理算法。由于供应商的实现中存在一个错误,即不回收已释放的内存句柄,因此系统提交的与缓冲区关联的内存不会被释放,从而导致此错误。