2009-09-14 37 views

回答

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命令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()完成了广告中的工作。

0

在您自己的函数中调用glDeleteTextures(int, int*)来维护一个分配表。

+0

我已经完成了所有那些面向对象的方式,但我的观点是:是否可以手动检查纹理? – Karl

+0

那么它不是纯粹的Open GL相关的anylonger,是吗?如果将纹理作为纹理对象引用,那么为什么不创建为每个实例化纹理对象增加的全局计数器,并为每个已删除纹理减少。然后它不会比测量单个变量更困难...... – 2009-09-14 14:18:57

+0

嗯,我自己管理了这些glGenTextures和glDeleteTextures,但事情是这样的:因为没有什么东西从函数返回,比如删除纹理是否成功,我感到很焦虑。 24 MB是非常小的,特别是当您必须将所有这些压缩图像扩展到RAM时。我必须感到焦虑,我想知道该程序是否真的成功释放纹理。我不想稍后再发现我的纹理从未被释放。你可能认为我太担心,但记忆是一个非常严重的问题。 – Karl

相关问题