2

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

然而,这让我有点吃惊。OpenGL不应该为我管理纹理内存,根据需要在GPU和进程内存之间交换纹理吗?当然,规范glTexImage2D不包括任何“内存不足”错误作为任何可能的错误条件。

尽管有规范,这是否是 OpenGL 驱动程序普遍接受的做法?尽管有规范,只有一些驱动程序这样做吗?如果我在之后发现此错误,是否需要注意删除一段时间未使用的纹理glTexImage2D?或者我可能在这里看到了 OpenGL 的错误报告并没有很简洁地传达给我的完全不同的东西?

编辑:有关更多信息,不幸的是,我无法自己调试问题,因为我没有得到它。从人们发给我的报告中阅读,绝大多数受此困扰的人似乎都在使用英特尔卡,但我也发现了一些 nVidia 卡(甚至是 680)。

4

1 回答 1

1

这只是一个猜测,但您的程序可能会遭受地址空间碎片的影响。如果确实如此,那么您在 Java 运行时中运行确实很重要。

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

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

于 2012-12-04T21:39:02.730 回答