手册只是指导您写:是否可以检查iPhone上的OpenGL ES纹理是否已真正释放?
glDeleteTextures(1, &GLtexture);
,并声称,纹理将被删除。 iPhone缺乏内存,我想确保这些纹理真正被释放。
泄漏仪器无法检测到这一点,坦率地说,我有点担心。我确实想确保纹理真的没有了。
谢谢。
手册只是指导您写:是否可以检查iPhone上的OpenGL ES纹理是否已真正释放?
glDeleteTextures(1, &GLtexture);
,并声称,纹理将被删除。 iPhone缺乏内存,我想确保这些纹理真正被释放。
泄漏仪器无法检测到这一点,坦率地说,我有点担心。我确实想确保纹理真的没有了。
谢谢。
纹理不是由Obj-c运行时处理的,所以泄漏并不知道它们。你必须使用另一种工具。
在Xcode中使用OpenGL模板启动一个新项目。搜索的更新/绘制场景中的方法,并且此代码添加到它的结尾:
static int tick = -1;
static GLuint tex[5];
if (tick++ < 0)
for (int f = 0; f < 5; f++)
tex[f] = 0;
tick = tick % 5;
if (tex[tick]) {
glDeleteTextures(1, &tex[tick]);
tex[tick] = 0;
} else {
glGenTextures(1, &tex[tick]);
glBindTexture(GL_TEXTURE_2D, tex[tick]);
char *mem = malloc(1024 * 1024 * 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, mem);
free(mem);
}
的代码生成和破坏使用OpenGL命令5个纹理。构建它并在设备上运行一次以确保它已安装。不要担心闯入。
现在打开乐器,并从iPhone的空白模板开始。打开库并将内存监视器拖到窗口中。点击信息披露按钮并取消选中除“无物理内存”之外的所有内容。现在选择启动iPhone上的二进制文件开始录制。取决于Instruments何时试图对应用程序进行采样,您应该看到楼梯模式正在上升/下降。在程序运行时,您可以看到列“Real Memory”的所有活动进程,显示实际的内存使用情况。
在我的测试中,这个例子根据内存采样的时刻消耗25MB到3MB。这是与第二代iPhone和SDK 3.1。如果您有2.x SDK,则必须在常规OpenGL监视器中搜索GART驻留对象大小。请参阅http://blog.zincroe.com/2009/04/how-to-check-iphone-texture-memory-usage-with-instruments/作进一步参考。
在任何情况下,上下跳转的内存都证明glDeleteTexture()完成了广告中的工作。
在您自己的函数中调用glDeleteTextures(int, int*)
来维护一个分配表。
我已经完成了所有那些面向对象的方式,但我的观点是:是否可以手动检查纹理? – Karl
那么它不是纯粹的Open GL相关的anylonger,是吗?如果将纹理作为纹理对象引用,那么为什么不创建为每个实例化纹理对象增加的全局计数器,并为每个已删除纹理减少。然后它不会比测量单个变量更困难...... – 2009-09-14 14:18:57
嗯,我自己管理了这些glGenTextures和glDeleteTextures,但事情是这样的:因为没有什么东西从函数返回,比如删除纹理是否成功,我感到很焦虑。 24 MB是非常小的,特别是当您必须将所有这些压缩图像扩展到RAM时。我必须感到焦虑,我想知道该程序是否真的成功释放纹理。我不想稍后再发现我的纹理从未被释放。你可能认为我太担心,但记忆是一个非常严重的问题。 – Karl