【发布时间】:2022-01-05 17:22:26
【问题描述】:
我目前正在提高我在 OpenGL 和 DirectX 12 方面的知识,以便使用这两种 API 创建图形应用程序。我研究了几个教程,但我仍然不完全了解,GPU 端是如何管理内存的。
在 OpenGL(我的应用程序运行 OpenGL 3.3 上下文)中,帧缓冲区是隐式创建的,因此我假设它们也被 API 隐式释放。在我的示例程序中,我使用glGenBuffers 创建了顶点和索引缓冲区,并使用glBufferData 将它们上传到GPU。如果我想每帧更新我的顶点缓冲区,我可以简单地使用glBufferSubData 来完成。让我们假设,我想使用glBufferData 在每一帧重新上传我的顶点缓冲区。根据 OpenGL 文档,此函数在 GPU 上创建并初始化缓冲区的数据存储。所以我假设,映射到这个 VBO 的 GPU 内存在下一帧中再次调用 glBufferData 后被重用。
在 DirectX 12 中,帧缓冲区必须由图形程序员创建。这些在程序的生命周期内由交换链管理和重用。在我的 DirectX 12 测试程序中,我还使用上传堆和 ID3D12Device::CreateCommittedResource 函数创建顶点和索引缓冲区。为了测试目的,我也在每一帧都这样做。缓冲区存储在Microsoft::WRL::ComPtr<ID3D12Resource> 变量中。在渲染方法结束时,这些缓冲区指针的使用计数应该达到0,这将释放 CPU 端的内存。不过,我不明白 GPU 端的数据和底层堆会发生什么。它们是否被释放,每当缓冲区指针的使用计数达到0 时,它们是否需要手动释放,它们是在到达栅栏时被 GPU 丢弃还是没有。
如果您能就这个主题和我的假设提供一些澄清,我将不胜感激。
您能否解释一下图形程序员是否需要以及如何释放 GPU 数据。
最好的问候。
【问题讨论】:
-
缓冲区对象和“帧缓冲区”是不同的东西。
-
感谢您的提示。我知道它们是不同的,但我认为它们都用于引用或管理 CPU 内存。是这样吗?
标签: c++ opengl memory gpu directx-12