为什么iOS设备上的glGenerateMipmap()占用了这么多客户端内存?

时间:2016-12-21 10:00:28

标签: ios memory opengl-es gpu

我正在开发一款使用OpenGL ES呈现图片的iOS应用。这是我的函数的关键代码片段,用于设置纹理参数和数据:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);

这适用于iPhone,但在缩小时会出现锯齿现象。所以我尝试使用mipmap,修改以前的代码如下:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);// for mipmapping
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
glGenerateMipmap(GL_TEXTURE_2D);// This will generate all mip-mapping textures

这个mipmapping运行良好,在缩小时不会出现混叠现象。

然而,我发现mipmapping占用了太多内存:不是图形内存,而是主内存(用OpenGL术语,不是服务器端内存,而是客户端内存)!

我用仪器的Memory Monitor确认了这一点:

如果没有mipmapping,我的纹理设置功能几乎不会占用任何内存,即使纹理源是4K分辨率图像。这样的结果清楚地证明了glTexImage2D只在OpenGL服务器(即图形卡)中分配内存,因此内存监视器无法监视它,而不关心图形内存的使用。

但是使用glGenerateMipmap()进行mipmapping时,当我创建4K纹理时,堆内存使用量会快速增加约100M。在glDeleteTextures()之后,它会回落。

似乎glGenerateMipmap()不仅在图形内存中生成mip贴图纹理,而且还消耗主内存。删除纹理后,可以回收这段主内存。很奇怪,不是吗?

我想知道为什么。 我的关键点是,如何在没有太多内存使用的情况下使用mip映射?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

一帆风顺。

  1. 您可能需要设置GL_TEXTURE_MAX_LEVEL(默认值为1000)和GL_TEXTURE_BASE_LEVEL(默认值为0)的值。
  2. 4K分辨率图像并不意味着“4K纹理”。根据我的经验,如果图像的长度是1025 X 1025,那么纹理是2048 X 2048.请检查图像的大小。
  3. “cpu memory” - > “主要记忆”; “gpu memory” - > “图形记忆”,后者可能合适。

答案 1 :(得分:1)

您不应该使用glGenerateMipmap(),而是使用PVRTexTools或TextureTool等工具并使用PVRTC压缩格式,请参阅: https://developer.apple.com/library/content/qa/qa1611/_index.html