我使用OpenGL像素缓冲对象(PBO /GL_PIXEL_UNPACK_BUFFER
)将数据从CPU内存上传到GPU内存。
我使用PBO快速上传数据的经典方法:我创建一个GL_PIXEL_UNPACK_BUFFER
,我Map它以获得CPU内存空间中的地址,我将数据复制到这个位置。稍后,当渲染器需要数据时,我将PBO馈送到我的OpenGL纹理中。这工作得非常好,非常快。我相信我的实现是正确的,但这不是重点。
据我所知,PBO内存分配在系统内存中的专用区域。该区域也称为“共享GPU内存”,您可以在Windows任务管理器中查看其状态。
我遇到了以下问题:我使用了很多PBO,在某个时候,“共享GPU内存”已满,我的应用程序崩溃,NVidia驱动程序给我一个内存不足错误。我无法用glGetError() == GL_OUT_OF_MEMORY
捕获此错误。据我所知,此错误报告不可靠。**如何检查总/当前可用PBO内存/共享GPU内存的大小?**到目前为止,我还没有找到使用OpenGL的方法。其他GPU API(DirectX,Vulkan,CUDA)是否提供有用的功能?
1条答案
按热度按时间kcrjzv8t1#
OpenGL没有提供任何机制来查看任何类型的内存还有多少可用,甚至硬件有多少。Vulkan允许你查询后者,但即使是它也不允许你检查可用性。主要是因为可用内存问题的答案在你得到它的时候已经过时了,因为这个答案可能取决于其他 * 应用程序 * 正在做什么。
为了避免这种情况,只需跟踪自己的分配。最简单的方法是分配一个大的PBO,并根据需要在内部细分它。本质上,将一个PBO视为您从中分配的“堆”。这样,如果您用完了子分配的空间,您就会知道,因为它是 * 您的 * 代码无法从其“堆”中子分配内存。