Pracuję na grze iPhone, który wykorzystuje MKMapView jako planszy. Po zaledwie kilku minutach gry aplikacja nieuchronnie zaczyna się powolny i ostatecznie ulega awarii z powodu braku pamięci. Po wykopaniu około sprawcy wydaje się, że mapa ciągle wymaga więcej pamięci. Gra wymaga dużo powiększanie i przesuwanie mapy, więc mogę tylko przypuszczać, że mapa jest cache kafli tylko ciągle rośnie, aż do zapełnienia pamięci. Czy istnieje jakiś sposób, aby wymusić na widok mapy do spłukiwania to cache kafli lub zawierają go to zużycie pamięci?
Wyczyść cache MKMapView za płytek?
* UWAGA: Ta odpowiedź jest istotne tylko dla iOS 4.1 i niższych. Problemy opisane w tej odpowiedzi były przeważnie ustalona w iOS 4.2 *
Robiłem trochę kopania na to jak moja aplikacja używa zarówno mapę, a także posiada inne cechy, które wymagają dużej ilości pamięci RAM.
Nie znalazłem odpowiedzi, ale obejścia. Wymagania pamięciowe MKMapView za eskalacji wykładniczo jak przybliżyć bliżej do powierzchni i przesuwać w obrębie że powiększony obszar.
Istnieją dwa poziomy MKMapView płytek pamięci podręcznej. Jeden przejawia się jako Malloc ~ 196kb instrumentami, drugi jest NSData (sklep) o różnych rozmiarach.
Malloc wydaje się być aktywne kafelki w użyciu, a tam jest twarda czapka na ile mogą być przydzielone. W moim app, że numer jest 16, nie wiem, czy jego podstawie rozmiaru UIView, czy nie. Przydziały te wydają się być ściśle zarządzana i reaguje na ostrzeżenia pamięci.
W każdym razie, na pewnym poziomie powiększenia, powiedzmy, poziom kontynentu (na tyle, aby dopasować najbardziej Ameryki Północnej w ekran iPad), biorąc pod uwagę wielkość płytek, jeśli naprawdę nie ma się do tego drugiego poziomu buforowania (NSData (Store) ) w celu zakończenia mapę. Wszystko jest schludny i czysty. Jeśli załadować na tony obrazów zewnętrznych do aktywnego pamięci, płytki przycinać siebie. Niesamowite!
Problem pojawia się, gdy natrafi tego drugiego poziomu buforowania. Dzieje się tak, gdy powiększanie i nagle zamiast 16 płytek, aby pokazać całą Planat, potrzebuje 16 płytek po prostu pokazać Los Angelas, a jak przesuwać zamiast po prostu dumpingu te stare płytki kładzie je do NSData (sklepu przydziały), gdzie wydają się nigdy nie uwolnił.
Ten NSData (sklep) jest NSURLConnectionCache który istnieje domyślnie tylko w pamięci. Nie można uzyskać dostęp do tej pamięci podręcznej, aby je ograniczyć, ponieważ nie jest domyślnym wspólny cache (już próbowałem).
Tak to gdzie mogę utknąć.
Odpowiedź niezadowalająca jest, że jeśli wyłączyć powiększanie mapy i naprawić go w dość szerokim poziomu powiększenia, można uniknąć tego problemu całkowicie, ale oczywiście niektóre aplikacje trzeba to ... i to ile mam.
I złożył zgłoszenie do pomocy technicznej z Apple, aby zobaczyć, czy mogą ujawniać w dowolny sposób, aby ograniczyć tę śmieszną cache na mapie (która przy okazji udało mi się przypadkowo korby do 50+ mega RAM przydzielonych w aktywnej pamięci).
Mam nadzieję że to pomoże.
edytować
W kolejnej wersji iOS pojawi się rozwiązać ten problem nieograniczoną cache. MKMapView teraz agresywnie przycina swoje dane płytki buforowane. CIESZYĆ!
Czy ustawienie identyfikatora ponownego wykorzystania w widokach adnotacji? (Oznacza to, że system może odłączyć te poglądy i tylko zachować niewielką liczbę wyświetleń w pamięci na raz. To również zwiększa wydajność przewijania, bo przewijanie będzie ponownie wykorzystać wolnostojący widoki).
Użyj tej metody, aby uzyskać widok adnotacji do ponownego wykorzystania:
- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier
Jeśli tworzysz aplikację tylko z mapkit i rozmiarze widzenia 768x1024 (wielkość iPad), aplikacja może łatwo zużywają ponad 30+ MB „na żywo” jak donosi Bytes przez program Instrumenty alokacji. Ten został zauważony uruchomiony na v3.2.2 iPad z iOS (najnowszej wersji aż do następnych tygodniach rzekomych 4.2 Release). Z moich badań wydaje się, że ta ilość pamięci jest dużo dla pojedynczej aplikacji, gdzie większość deweloperów zgłaszają otrzymaniu poziom 1 ostrzeżenie pamięć około 15-25 MB i wywala zaraz po tym poziomie.













