glDrawElements分配内存而不释放内存

时间:2009-12-09 07:39:41

标签: iphone objective-c opengl-es memory-management

在iPhone 3G上使用OpenGLES 1.1(设备,而不是模拟器),我做了正常的绘画乐趣。但是在应用程序运行期间,我得到了巨大的内存峰值,经过大量的工具挖掘后,我发现glDrawElements正在抓住内存。

分配的缓冲区是4兆,这对我来说意味着它将纹理加载到RAM中,我猜这可能是有效的,但它从不释放这个缓冲区,并且正在分配它们中的多个。

如何确保GL正在创建的这些缓冲区被破坏,而不是只是闲逛?

3 个答案:

答案 0 :(得分:2)

这听起来不像是泄漏,更像是一个驱动程序优化,其中GPU保留在内存块(顶点缓冲区,纹理等)以防再次需要它。如果你运行你的应用程序一段时间它是否继续分配越来越多的内存,直到设备最终耗尽内存?

令人遗憾的是,第一代iPhone 3G没有对顶点缓冲对象(VBO)的适当支持,它们由API公开,但它们的工作方式与普通的软件顶点缓冲区完全相同。这意味着无论何时调用glDrawElements,您使用glVertexPointer等设置的顶点缓冲区都将从系统内存复制到GPU。

你可以将内存“泄漏”到OpenGL的唯一方法是重复分配各种缓冲对象(纹理对象,顶点缓冲对象,帧缓冲对象等)而不释放它们,就像每帧一样:

GLuint id;  
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);        
glTexImage2D(...);

你最终会耗尽内存。我自己在iPhone 3G上使用glDrawElements并且我没有看到这个问题,你能给一个小的repro代码样本吗?

答案 1 :(得分:0)

检查模拟器或iPhone设备本身是否存在。仪器/泄漏可以并且将在模拟器上报告误报,您将不会在设备上遇到这些误报。

答案 2 :(得分:0)

我在IRC的一些人的帮助下想到了这一点。问题最终成为我在我的应用程序中进行线程化的方式。通过将GL和游戏更新循环移动到同一个线程,问题消失了,我不知道为什么另一种方式导致了它所做的内存分配,但问题得到了解决。