Opengl 实际GPU内存使用情况与glDeleteXXXX?

Opengl 实际GPU内存使用情况与glDeleteXXXX?,opengl,memory,graphics,game-engine,Opengl,Memory,Graphics,Game Engine,GPU驱动程序是否有义务根据需要从应用程序中释放GPU内存?如果不是,那么这是否会使应用程序可能希望执行的任何GPU内存资源管理无效,因为它是从实际内存中“移除”的一层 我正在分配大量纹理,然后释放它们。在分配时,我可以看到“GPU系统字节”(在Process Explorer中)迅速增加(数量远远超过图像硬盘空间-可能它们在GPU中未压缩,因此占用大量空间) 释放纹理时,我可以看到Texture2D对象析构函数正确地调用了glDeleteTexture,但“GPU系统字节”中似乎有一个延迟减少

GPU驱动程序是否有义务根据需要从应用程序中释放GPU内存?如果不是,那么这是否会使应用程序可能希望执行的任何GPU内存资源管理无效,因为它是从实际内存中“移除”的一层

我正在分配大量纹理,然后释放它们。在分配时,我可以看到“GPU系统字节”(在Process Explorer中)迅速增加(数量远远超过图像硬盘空间-可能它们在GPU中未压缩,因此占用大量空间)

释放纹理时,我可以看到Texture2D对象析构函数正确地调用了glDeleteTexture,但“GPU系统字节”中似乎有一个延迟减少回原始值,事实上,该值并没有返回到原始值,它在其上方徘徊了一点

如果继续这样做,我会看到GPU内存使用率逐渐增加,但一直以来,我都在计算我的glDeleteTexture调用,内存似乎从未完全恢复

我被迷惑了,因为从应用程序的角度看,它看起来很干净-x分配,x释放-但我看到我的应用程序变得有点资源消耗,不是在进程的内存空间,而是GPU内存空间,正因为如此(Intel HD 6000 GPU)

GPU驱动程序是否有义务根据需要从应用程序中释放GPU内存

不会。OpenGL驱动程序会在任何时候返回内存

如果不是,那么这是否会使应用程序可能希望执行的任何GPU内存资源管理无效,因为它是从实际内存中“移除”的一层


这是使用基于硬件抽象的API的结果。如果您想避免被“从实际内存中删除一层”,您应该使用Vulkan。

谢谢。这就是3d图形软件产品通常提出的最低要求吗?使用不同制造商的图形卡进行反复试验,监控实际使用情况与应用经验,以找到最小可接受点?Ps AAA游戏是否必须为每个驱动程序编写特定的代码,以便“玩得很好”@layth:最低要求主要基于对程序在渲染典型帧过程中积极使用的GPU资源量的了解。当使用OpenGL时,您实际上不受GPU提供的限制。完全有可能(如果驱动程序支持的话)为GPU内存分配更多的图形资源(纹理、顶点缓冲区等)。此外,现代GPU还可以根据需要将内容从系统内存移动到系统内存。@layth:然而,许多应用程序确实包含特定OpenGL实现(驱动程序/GPU)的特殊代码路径,以调整某些方面。同样,NVidia和AMD的驱动程序实际上也会向某些应用程序热注入补丁代码,以修复问题并提高性能。哇。我只是刚刚接触到图形,但我必须说,我们是听命于这么多是相当糟糕的。事先不知道其工作负载的应用程序会做什么?我所需要的只是一个删除,它会。。删除。在我的例子中,英特尔图形驱动程序拒绝释放内存,我的应用程序可以而且确实需要更多的新内存(因为我们以前释放了内存),但由于英特尔驱动程序没有释放我释放的内存,我运行的笔记本电脑在不太长的时间后就“所有的风扇都在燃烧”…@layte:“所有的风扇都在燃烧”是一个不应该由内存资源不足引起的问题,除非所有数据的乱序都会导致高CPU负载,而这通常不会。对于正确编写的OpenGL驱动程序,您只需分配新的纹理/缓冲区,让旧的东西堆积起来。它将消耗一些系统RAM,并可能导致过度交换。不必删除纹理即可为新数据腾出“空间”。这就是为什么
glDeleteTextures
/
glDeleteBuffers
将点指向数组而不仅仅是单个值的原因。