Testowałem swoją grę na iOS i zauważyłem rozbieżność pomiędzy ilością zajmowanej pamięci i ilością, jaką powinna ona podjąć. W końcu zawęziłem problem do tekstur, zabierając o 33% więcej pamięci, niż myślałem.Tekstury iOS Pobieranie 33% dodatkowej pamięci
Na przykład, wydaje mi się, że nieskompresowana 32-bitowa tekstura 256x256 powinna zająć 256 * 256 * 4 bajty = 256k. Jednak zauważyłem, że pamięć aplikacji rośnie o 340k przy przydzielaniu tekstury 256x256. To było tak, jakby urządzenie przydzielało wystarczającą ilość pamięci do przechowywania tekstury i wszystkich jej mipmap, ale nie używam map mipa ani nie pytam o przestrzeń w żaden sposób.
Ta dodatkowa pamięć wyróżniała się, ponieważ miała miejsce tylko na niektórych urządzeniach. Zauważyłem dodatkowej pamięci podczas testowania gry na iPod Touch 4. Jednak problem nie występuje na iPhone 3GS, iPod lub iPad 3G 1.
Wersje systemu na urządzeniach są:
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
Oto trochę więcej informacji. Zmierzam pamięć aplikacji w ten sposób, tak jak ta
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;
}
Zwraca tę samą wartość, którą zobaczysz w programie Insturments dla Real Mem. Jest to bardzo przydatne.
A oto jak ja przeznaczyć moje tekstur:
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;
}
To wszystko jest bardzo proste rzeczy. Jedyną rzeczą, która doprowadziła mnie do znalezienia problemów z pamięcią w pierwszej kolejności, była rozbieżność między różnymi urządzeniami. W rzeczywistości była to rozbieżność pomiędzy całkowitą pamięcią aplikacji i pamięcią zasobów (sam śledziłem obrazy i pamięć dźwiękową), które skłoniły mnie do zbadania, aby znaleźć ten błąd.
Oczywiście, że nie dotyczy to kodu efektu, ale zastanawiam się, czy ma to coś wspólnego z wyświetlaczem Retina? – summea
Jak mierzysz pamięć aplikacji? – Justicle