2012-09-21 7 views
5

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?

+0

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

+0

ł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 –

Odpowiedz

0

Jest tak prawdopodobnie ze względu na fakt, że używane obrazy są kompresowane za pomocą png lub jpg, a po odkodowaniu do pamięci są znacznie większe niż oryginalny rozmiar pliku. Zajmie to coś jak szerokość * wysokość * 4 bajty pamięci bez względu na zawartość obrazu.

+0

Czy istnieje jakakolwiek inna metoda kompresji lub jakiekolwiek inne rozszerzenie, którego mogę użyć, aby zapobiec tak ogromne wykorzystanie pamięci? –

0

początek byłoby nie użytku -[UIImage imageNamed:] dla obrazów, które pasują do żadnej z kwalifikacji:

  • dużej wielkości
  • średniej wielkości
  • „... tylko jedna instancja ... tworzone podczas aplikacji koło życia."

Należy jednak zwrócić uwagę na wpływ tych zmian na program. w miarę możliwości korzystasz z pamięci. co sugeruję, to przesunięcie niektórych z tych obowiązków na inne dziedziny. rozprowadzaj ładunek, aby nadal czuł się szybko, ale ma lepszą równowagę zasobów. gdy użyjesz mniejszej pamięci podręcznej, zauważysz, że możesz skończyć czytanie i rozszerzenie niektórych plików więcej niż jeden raz. następnie spróbuj dowiedzieć się, gdzie powinieneś udostępnić załadowane obrazy. oczywiście ładuj tylko to, czego potrzebujesz. następnie weź to, czego się nauczysz i zobacz, jak można to zastosować do reszty twoich obrazów.

również, podziel zdjęcia - masz obrazy, które są kilka razy większe niż rozmiar ekranu. jeśli muszą mieć taki rozmiar, a następnie je rozbijać - jeśli są tylko pomniejszone, gdy są prezentowane, to należy je zmienić przed dystrybucją (np. więc nie wymagają skalowania - będzie znacznie szybciej wyświetlać, wyglądać znacznie lepiej, i zużywają mniej pamięci).

Powiązane problemy