Текстуры iOS занимают 33% дополнительной памяти

Я тестировал свою игру для iOS и заметил несоответствие между объемом памяти, который она занимала, и тем, думала , что она должна занимать. В конце концов я сузил проблему до текстур, которые занимают на 33% больше памяти, чем я думал.

Например, я думаю, что несжатая 32-битная текстура размером 256x256 должна занимать 256 * 256 * 4 байта = 256 КБ. Однако я бы заметил, что объем памяти приложения увеличился примерно на 340 КБ при выделении текстуры 256x256. Это было так, как если бы устройство выделяло достаточно памяти для хранения текстуры и всех ее MIP-карт, но я не использую MIP-карты и никоим образом не запрашиваю пространство.

Эта дополнительная память выделялась, потому что это могло произойти только на определенных устройствах. Я заметил дополнительную память при тестировании игры на 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;
}

. Это возвращает то же значение, которое вы увидите в программе 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;
}

Это все очень простые вещи.Единственное, что в первую очередь привело меня к обнаружению проблем с памятью, - это несоответствие между разными устройствами. Фактически, именно несоответствие между общей памятью приложения и памятью ресурсов (я сам отслеживаю изображения и звуковую память) заставило меня исследовать эту ошибку.

9
задан Brian Rothstein 24 February 2012 в 23:07
поделиться