是否可以检查iPhone上的OpenGL ES纹理是否已真正解除分配?

时间:2009-09-14 10:40:16

标签: iphone memory opengl-es textures dealloc

手册刚刚指示你写:

glDeleteTextures(1, &GLtexture);

并声称纹理将被删除。 iPhone有很少的内存,我想确保这些纹理真正发布。

Leaks仪器无法检测到这一点,坦率地说,我有点担心。我确实想确保纹理真的消失了。

谢谢。

2 个答案:

答案 0 :(得分:3)

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命令生成并销毁五个纹理。构建它并在您的设备上运行一次以确保它已安装。不要担心这种情况。

现在打开乐器并从iPhone的空白模板开始。打开库并将Memory Monitor拖到窗口中。单击信息公开按钮并取消选中除“物理内存空闲”之外的所有内容。现在选择在iPhone上启动二进制文件以开始录制。您应该看到楼梯模式上升/下降取决于Instruments何时尝试对应用程序进行采样。程序运行时,您可以看到所有活动进程的“Real Memory”列,显示实际的内存使用情况。

在我的测试中,此示例消耗25MB到3MB,具体取决于内存采样的时刻。这是第二代iPhone和SDK 3.1。如果你有一个2.x SDK,你必须在普通的OpenGL监视器中搜索GART Resident Object Size。有关详细信息,请参阅http://blog.zincroe.com/2009/04/how-to-check-iphone-texture-memory-usage-with-instruments/

在任何情况下,内存上下跳动证明glDeleteTexture()按照宣传的方式完成其工作。

答案 1 :(得分:0)

在您自己的函数中将调用传递给glDeleteTextures(int, int*),以维护分配表。