在我们的游戏应用中,使用没有预乘alpha的纹理非常重要。因此,对于加载纹理,如Apple指南中所述,我们使用GLKTextureLoader
。
方法1:
...
GLKTextureInfo* pTextureInfo = [GLKTextureLoader textureWithContentsOfFile:pPath options:pTextureOptions error:&pError];
...
在选项中我们可以关闭预乘alpha并且一切都很好,但似乎存在巨大的内存问题!
相比之下,我们可以通过使用UIImage和CoreGraphics来加载纹理,但是之前预乘的alpha问题仍然存在。这里的好处是我们有更多的控制权,并且可以通过glTexImage2D(…):
方法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内存中释放图像/像素数据。为什么不?有没有办法手动完成?如何避免这种巨大的额外(和不必要的)内存消耗?
感谢任何帮助。提前谢谢!