使用GLKTextureLoader加载纹理似乎浪费了CPU内存?

时间:2013-11-20 13:06:17

标签: ios opengl-es memory-leaks

在我们的游戏应用中,使用没有预乘alpha的纹理非常重要。因此,对于加载纹理,如Apple指南中所述,我们使用GLKTextureLoader

方法1:

...
GLKTextureInfo* pTextureInfo = [GLKTextureLoader textureWithContentsOfFile:pPath options:pTextureOptions error:&pError];
...

在选项中我们可以关闭预乘alpha并且一切都很好,但似乎存在巨大的内存问题!

相比之下,我们可以通过使用UIImage和CoreGraphics来加载纹理,但是之前预乘的alpha问题仍然存在。这里的好处是我们有更多的控制权,并且可以通过glTexImage2D(…):

将像素数据传递到GPU后轻松释放CPU内存中的像素数据

方法2:

...
uint8_t* pixelData = loadImageDataWithUIImageAndCoreGraphics(…);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
delete[] pixelData;
...

使用方法1加载纹理 Xcode显示内存消耗为80MB,使用方法2 时,内存消耗仅为55MB。如果我们现在通过不删除像素数据来创建内存泄漏(删除方法2 中的行“delete [] pixelData”),那么内存消耗也大约为80MB。

因此,似乎GLTextureLoader在将内容传递给GPU后不会从CPU内存中释放图像/像素数据。为什么不?有没有办法手动完成?如何避免这种巨大的额外(和不必要的)内存消耗?

感谢任何帮助。提前谢谢!

0 个答案:

没有答案