la cache di chiara MKMapView di piastrelle?

voti
6

Sto lavorando su un iPhone gioco che utilizza un MKMapView come campo di gioco. Dopo solo un paio di minuti di gioco l'applicazione inizia inevitabilmente per ottenere lento e alla fine si blocca a causa di memoria insufficiente. Dopo aver scavato intorno il colpevole sembra essere che la visualizzazione della mappa richiede costantemente più memoria. Il gioco richiede un sacco di zoom e panning della mappa e quindi posso solo supporre che la cache della mappa di piastrelle continua a crescere fino a quando non esaurisce la memoria. C'è un modo per forzare la visualizzazione della mappa per svuotare la cache è di piastrelle o contenere sia il consumo di memoria?

È pubblicato 16/12/2009 alle 20:58
fonte dall'utente
In altre lingue...                            


3 risposte

voti
4

* NOTA: Questa risposta è rilevante solo per iOS 4.1 e inferiori. I problemi descritti in questa risposta sono stati principalmente fissati in IOS 4.2 *

Ho fatto qualche ricerca su questo come la mia applicazione utilizza sia la mappa e ha anche altre caratteristiche che richiedono elevata RAM.

Non ho trovato una risposta, ma una soluzione. richieste di memoria di MKMapView degenerare in modo esponenziale, come lo zoom più vicino a una zona, e Pan intorno all'interno di tale area ingrandita racchiusa.

Ci sono due livelli di cache piastrelle MKMapView. Uno si manifesta come un Malloc ~ 196KB in Strumenti, l'altro è NSData (negozio) di varie dimensioni.

Il Malloc sembra essere le tessere attive in uso, e non v'è un hard cap su quanti possono essere assegnati. Nel mio app che numero è 16, non so se la sua in base alla dimensione UIView oppure no. Queste assegnazioni sembrano essere rigorosamente gestito, e risponde ad avvisi di memoria.

In ogni caso, ad un certo livello di zoom, per esempio, il livello di continente (abbastanza da contenere la maggior parte del Nord America in uno schermo iPad), date le dimensioni delle piastrelle, se non ha mai veramente per arrivare a quel secondo livello di caching (NSData (Store) ) al fine di completare la mappa. Tutto è fresco e pulito. Se carico in una tonnellata di immagini esterne in memoria attiva, piastrelle stesse potare. Eccezionale!

Il problema arriva quando colpisce che secondo livello di caching. Questo accade quando si esegue lo zoom in, e improvvisamente invece di 16 tessere per mostrare l'intera PLANAT, ha bisogno di 16 piastrelle solo per mostrare fuori Los Angelas, e come ci si sposta in giro invece di scarico quelle vecchie piastrelle li mette in NSData (negozio ) assegnazione di fondi in cui sembra di non arrivano mai liberati.

Questo NSData (deposito) è la NSURLConnectionCache che esiste per impostazione predefinita solo nella memoria. Non è possibile accedere a questa cache per limitarlo, perché non è la cache di default condivisa (già provato).

Quindi questo è dove mi si blocca.

La risposta insoddisfacente è che se si disattiva la mappa di zoom e risolvere il problema in un ragionevolmente ampio livello di zoom, è possibile evitare completamente questo problema, ma ovviamente alcune applicazioni bisogno di questo ... e questo è quanto ho ottenuto.

Ho presentato una richiesta di assistenza con Apple per vedere se si può rivelare un modo per limitare questa cache ridicolo per la mappa (che tra l'altro sono stato in grado di manovella con disinvoltura fino a oltre 50 mega di RAM allocati nella memoria attiva).

Spero che questo ti aiuti.

modificare

La prossima versione di iOS sembra aver risolto questo problema di cache senza limiti. MKMapView ora pota in modo aggressivo i suoi dati nella cache di piastrelle. RALLEGRARSI!

Risposto il 01/11/2010 a 17:41
fonte dall'utente

voti
2

Stai impostando l'identificatore riutilizzo sui vostri punti di vista di annotazione? (Questo significa che il sistema possa staccare tali visualizzazioni e mantenere solo un piccolo numero di visualizzazioni in memoria contemporaneamente. Inoltre aumenta lo scorrimento prestazioni, in quanto lo scorrimento si riutilizzare le visualizzazioni staccati.)

Utilizzare questo metodo per ottenere una vista annotazione per essere riutilizzati:

 - (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier
Risposto il 17/12/2009 a 14:02
fonte dall'utente

voti
1

Se si crea un app con solo il MapKit e una dimensione vista 768x1024 (dimensione ipad), l'applicazione può facilmente consumare più di 30+ MB di "Live Byte", come riportato dal programma Instruments allocazioni. Questo è stato notato in esecuzione sul v3.2.2 iPad iOS (la versione più recente fino prossime settimane presunti 4.2 rilascio). Dalla mia ricerca sembra che questa quantità di memoria è molto per una singola applicazione, dove la maggior parte gli sviluppatori segnalano la ricezione di una memoria di livello 1 avvertimento intorno 15-25 MB e si blocca subito dopo quel livello.

Risposto il 17/11/2010 a 19:24
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more