Я тестировал свою игру для iOS и заметил несоответствие между тем, сколько памяти она занимает, и сколько считает, что должно занимать. В конце концов я сузил проблему до текстур, занимающих на 33% больше памяти, чем я думал, что они должны брать.
Например, я бы подумал, что несжатая 32-битная текстура 256x256 должна занимать 256 * 256 * 4 байта = 256 КБ. Однако я бы заметил, что при выделении текстуры 256x256 память приложения увеличивается примерно на 340 КБ. Как будто устройство выделяло достаточно памяти для хранения текстуры и всех своих мипмапов, но я не использую мипкарты и не спрашиваю пространство каким-либо образом.
Эта дополнительная память выделялась, потому что это могло произойти только на определенных устройствах. Я заметил дополнительную память при тестировании игры на iPod Touch 4. Однако проблема не возникла на iPhone 3GS, iPod 3G или iPad 1.
Версии os на устройствах:
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)
EDIT
Вот немного больше информации. Я измеряю память приложения следующим образом
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;
}
Возвращает то же значение, которое вы увидите в программе Insturments для Real Mem. Это на самом деле очень полезно.
А вот как я распределяю свои текстуры:
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;
}
Это все очень простые вещи. Единственное, что привело меня к обнаружению проблем с памятью, в первую очередь, было несоответствие между разными устройствами. Фактически, это было несоответствие между общей памятью приложения и памятью ресурса (я сам отслеживаю изображения и звуковую память), что заставило меня исследовать эту ошибку.