gpt4 book ai didi

iphone - glDrawElements 分配内存但不释放它

转载 作者:行者123 更新时间:2023-12-03 21:12:55 25 4
gpt4 key购买 nike

在 iPhone 3G(设备,而不是模拟器)上使用 OpenGLES 1.1,我可以享受正常的绘图乐趣。但在应用程序运行期间的某些时候,我会遇到巨大的内存峰值,经过大量使用仪器的挖掘后,我发现是 glDrawElements 占用了内存。

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

如何确保 GL 正在创建的这些缓冲区被销毁,而不是只是闲置?

最佳答案

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

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

向 OpenGL“泄漏”内存的唯一方法是重复分配各种缓冲区对象(纹理对象、顶点缓冲区对象、帧缓冲区对象等)并且不释放它们,就像每帧都这样做一样:

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

你最终会耗尽内存。我自己在 iPhone 3G 上使用 glDrawElements,但没有看到这个问题,您能提供一个小的重现代码示例吗?

关于iphone - glDrawElements 分配内存但不释放它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1872238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com