Niedawno napotkałem problem z zarządzaniem pamięcią w mojej aplikacji.Ekstremalnie wysokie wykorzystanie pamięci - jak radzić sobie z dużymi obrazami na iPadzie?
Aplikacja wykorzystuje zalety niektórych obrazów wysokiej jakości, co znacznie zwiększa wykorzystanie pamięci.
Oto niektóre informacje o projekcie i obrazy szczegóły, aby kwestia bardziej jasne:
Istnieje około 90 zdjęć dodanych do mojego projektu. Połowa z nich została zaprojektowana w rozmiarze 2x, aby obsługiwać nowy wyświetlacz Retina do iPada. Tak więc maksymalna liczba obrazów dla każdego urządzenia wynosi około 45.
Łączna wielkość wszystkich obrazów Retina wynosi około 25 megabajtów (rozmiar każdego z nich jest zmienny od 10 KB do 6,8 MB). Tymczasem rozmiar wszystkich obrazów standardów wynosi 11 megabajtów.
Rozmiar archiwum XCode projektu wynosi 44 megabajtów.
Maksymalna rozdzielczość pojedynczych obrazów w standardowej wersji wynosi około 1500x4000 pikseli, a minimalna to około 60x60 pikseli.
Maksymalna rozdzielczość pojedynczych obrazów w wersji Retina wynosi około 3000x8000 pikseli, a minimalna wynosi około 120x120 pikseli.
W wersji Retina obrazów występuje przyrostek "@ 2x ~ ipad" w nazwie, podczas gdy sufiks nazwy dla pozostałych to "~ ipad".
Istnieje tylko jedno wystąpienie większości obrazów podczas cyklu życia aplikacji.
Około 25 obrazów jest ładowanych podczas uruchamiania aplikacji, a pozostałe są ładowane podczas rozgrywki.
Użyłem [UIImage imageNamed: @ "image_name.png"] tam, gdzie chcę, aby załadować obraz (przy użyciu [UIImage imageWithContentsOfFile] i [UIImage imageWithData] był bardzo nieefektywne).
Ale tutaj jest tam problemem:
Kiedy prześledzić zużycie pamięci przy użyciu instrumentów widzę, że wykorzystanie pamięci app jest niezwykle wysoka. Oto statystyki alokacji pamięci w różnych sytuacjach:
przydzielonej pamięci na iPada 2 za pomocą standardowych obrazów przy starcie: 58 MB
przydzielonej pamięci na iPada 2 za pomocą standardowych obrazów w trakcie gry (gdy wszystkie obrazy są ładowane): 131 MB
- przydzielonej pamięci na nowy iPad za pomocą obrazów siatkówki przy starcie: 211 MB
- przydzielonej pamięci na nowy iPad za pomocą obrazów siatkówki w trakcie gry (gdy wszystkie obrazy są załadowany): 470 MB
Jakieś pomysły, dlaczego przydzielona pamięć jest dużo wyższa niż całkowita wielkość obrazów?
Dlaczego ładujesz wszystkie obrazy w pamięci? Należy unikać używania nazwy obrazu UIImageNamed, a zamiast tego używać obrazu UIImageWithContentsOfFile, ponieważ późniejsze ładowanie obrazu na stałe do pamięci .... Także jeśli obrazy są ogromne, należy je narysować w klasie CATiledLayer, tak aby rysowała im bardziej efektywnie na ekranie – Lefteris
ładuję wszystkie obrazy w pamięci, ponieważ wszystkie są potrzebne przed i podczas rozgrywki. Nie jest to zgodne ze zwykłym projektem, takim jak inne aplikacje, i wymagane jest załadowanie tych obrazów. Innymi słowy ładuję każdy obraz tylko wtedy, gdy jest to wymagane, ale problem polega na tym, że jest on wymagany do załadowania wszystkich przy uruchamianiu: D –