【发布时间】:2012-03-15 07:57:34
【问题描述】:
我正在测试我的 iOS 游戏,发现它占用的内存量与它认为应该占用的内存量之间存在差异。最终,我将问题缩小到纹理占用的内存比我认为应该占用的多 33%。
例如,我认为 256x256 未压缩的 32 位纹理应该占用 256*256*4 字节 = 256k。但是,当分配 256x256 纹理时,我会注意到应用程序的内存增长了 340k。就好像设备分配了足够的内存来存储纹理及其所有 mipmap,但我没有使用 mip map 或以任何方式请求空间。
这个额外的内存很突出,因为它只会在某些设备上发生。在 iPod Touch 4 上测试游戏时,我注意到额外的内存。但是,在 iPhone 3GS、iPod 3G 或 iPad 1 上没有出现此问题。
设备上的操作系统版本为:
iPod 3G - iOS 3.1.2 (7D11) iPhone 3GS - iOS 4.3.5 (8L1) iPod 4 - iOS 4.2.1 (8C148) iPad - iOS 4.3 (8F190)
编辑
这里有更多信息。我像这样测量应用程序的内存
int PlatformIOS::GetProcessMemUsage()
{
task_basic_info info;
mach_msg_type_number_t size = sizeof( info );
kern_return_t kerr = task_info( mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size );
if ( kerr == KERN_SUCCESS )
return info.resident_size;
return 0;
}
这将返回您将在 Real Mem 的 Insturments 程序中看到的相同值。它实际上非常有用。
这是我分配纹理的方式:
bool GL3DTextureDataPiece::CreateTextureSurface(X3DInterfaceImpl *theInterface, int theWidth, int theHeight, PixelFormat theFormat, RefCount *thePalette, bool generateMipMap)
{
glGenTextures(1,&mTexture);
theInterface->SetCurTexture(this);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, theWidth, theHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
return true;
}
这些都是非常基本的东西。唯一让我首先发现内存问题的是不同设备之间的差异。事实上,正是应用总内存和资源内存(我自己跟踪图像和声音内存)之间的差异,才促使我进行调查以发现这个错误。
【问题讨论】:
-
显示器不一定会影响代码,但我想知道它是否与 Retina 显示器有关?
-
你是如何测量应用程序内存的?
标签: ios memory opengl-es textures