我注意到DirectX api(来自AMD的驱动程序)存在问题。 如果我使用具有增量大小的createBuffer()创建d3d缓冲区并在for循环中释放它,则内存诊断工具会显示进程的私有字节大小不断增加。我想这可能是因为GPU映射的系统内存永远不会被释放。 BTW,cpu堆大小稳定。
- FOR 1000迭代缓冲区大小从1kb到1000 MB
开始- 使用CreateBuffer D3D11_USAGE_STAGING / D3D11_USAGE_DYNAMIC &安培; D3D11_CPU_ACCESS_WRITE
- d3dbuffer.Release& d3dbuffer = nullptr
- 上下文。 cleastate()和flush()同步释放d3dbuffer
醇>
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Tick #");
delay(1000);
}
因为进程内存使用率不断上升并最终达到我的物理内存16gb限制并崩溃。这很奇怪,因为我在创建后立即同步释放缓冲区。进程内存使用应该相对稳定。 有没有人可以解释一下directx内存管理是如何工作的?
答案 0 :(得分:0)
经过一番调查后,这种奇怪的行为是由DirectX实现引起的。基本上,Microsoft作为OS公司只定义DirectX API的接口/规范,第三方GPU供应商必须提供这些API的自己的实现。
Nvidia将提供一个,AMD将提供一个,如果突然高通想要支持DirectX,它也必须写一个。
在DirectX规范中没有完全定义缓冲区分配和释放机制,因此供应商需要提供最佳的内存管理算法。由于供应商的实现中存在一个错误,即不回收已释放的内存句柄,因此系统提交的与缓冲区关联的内存不会被释放,从而导致此错误。