OpenGL:纹理内存不足?

OpenGL:纹理内存不足?,opengl,memory-leaks,textures,Opengl,Memory Leaks,Textures,我正在使用OpenGL编写一个小游戏(通过JOGL在Java中编写,但我认为这并不重要),最近我收到了相当多的错误报告,有人收到OpenGL错误“1285”,这似乎表明“内存不足”。我在创建新纹理后检查glGetError时发现了这一点,这让我感觉纹理内存不足 然而,这让我有点吃惊。难道OpenGL不应该为我管理纹理内存,在GPU和进程内存之间交换纹理吗?当然,glTexImage2D的规范不包括任何“内存不足”错误以及任何可能的错误情况 不管规范如何,OpenGL驱动程序是否普遍接受这种做法?

我正在使用OpenGL编写一个小游戏(通过JOGL在Java中编写,但我认为这并不重要),最近我收到了相当多的错误报告,有人收到OpenGL错误“1285”,这似乎表明“内存不足”。我在创建新纹理后检查
glGetError
时发现了这一点,这让我感觉纹理内存不足

然而,这让我有点吃惊。难道OpenGL不应该为我管理纹理内存,在GPU和进程内存之间交换纹理吗?当然,
glTexImage2D
的规范不包括任何“内存不足”错误以及任何可能的错误情况

不管规范如何,OpenGL驱动程序是否普遍接受这种做法?是否只有一些驾驶员不顾规格而这样做?如果在
glTexImage2D
之后发现此错误,是否需要小心删除一段时间未使用的纹理?或者,我可能在这里看到了OpenGL的错误报告不能很简洁地传达给我的其他东西吗


编辑:对于进一步的信息,不幸的是,我不能自己调试这个问题,因为我没有得到它。从人们发给我的报告中可以看出,大多数受此影响的人似乎都在使用英特尔卡,但我也发现了一些nVidia卡(甚至680)。

这只是一个猜测,但您的程序可能会出现地址空间碎片。如果是这样的话,那么在Java运行时运行确实很重要

OpenGL,即实现,必须保留所有数据对象的副本,以便它可以根据需要交换它们。但这些副本需要进程的地址空间。如果您的流程环境执行大量的分配/解除分配,这正是Java的本质(为几乎所有内容创建对象),那么您的地址空间可能会变得支离破碎,无法再分配更大的卡盘


需要检查的几点:您的程序是在32位还是64位JRE上运行的。如果它是32位可执行文件,请尝试一下如果使用64位JRE会发生什么。如果这些问题在64位环境中消失,而在32位环境中的同一台机器上,则肯定是地址空间碎片问题。

我希望自己可以尝试一下,但不幸的是,我没有收到任何错误,因此我只能查看我收到的报告体。不幸的是,几乎所有这些都不是来自64位JRE,所以我不能做太多的比较。不过,我确实怀疑这是地址空间碎片的情况。JRE在一个连续的映射中分配它的堆(在本例中为512 MB),因此它内部的频繁分配不应该影响OpenGL的内存分配,而且我从来没有见过JRE进程变得如此之大以至于需要担心地址空间不足。整个过程只需要大约1GB的驻留内存,所以除非严重碎片化,否则应该还有很多虚拟空间,我想。@Dolda2000:在剩余的地址空间中,有足够的连续空间来容纳大的纹理图像吗?我不太明白怎么会没有。JVM进程的整个虚拟大小几乎不超过1GB,因此应该至少剩下2GB的地址空间。在这两个千兆字节中,我很难相信没有几兆字节的连续空间。我看不出如果不是这样的话,它的分配会有多奇怪