Domanda

Sto facendo un gioco che deve caricare tutte le immagini bitmap alla partenza perché nel editor di gioco in-built l'utente può mettere qualsiasi degli sprite nel livello. Anche i livelli usano vari sprite senza alcun sistema che consenta di caricare gruppi di sprites dinamicamente per ogni livello.

Dopo un po 'sono ora già oltre 250 immagini PNG nel gioco con la dimensione totale di 3,5 MB.

I carichi di gioco più sprite (circa 200) utilizzando BitmapFactory.decodeStream senza opzioni impostate, e ci sono anche circa 50 altre, che si fa riferimento a schemi XML di attività.

Quando ho test su vari dispositivi, il gioco a volte esaurisce la memoria, ma non riesco a trovare un modello e anche decidere di quanto devo, per esempio ridurre le dimensioni delle immagini o il loro numero.

Il telefono su cui ho sviluppato, il desiderio di HTC con Android 2.2 24 MB VM dimensione heap mai eseguito OOM.

Dell Streak con Android 2.2 e 40 MB VM dimensione heap mai eseguito OOM, anche.

Motorola Milestone con Android 2.1 e 24MB VM Heap Size successo carichi tutti gli sprite, ma soffoca le poche ultime immagini utilizzate in uno all'avvio del ImageView delle attività (menu di avvio). Se io commento un paio di tali ImageViews out, carica ok, ma può soffocare una delle altre attività successive. E 'anche non è stabile, probabilmente perché la frammentazione avviene in modo diverso in diversi lanci.

HTC Hero con 2.2 di mio amico (dunno la dimensione heap, è 16MB?) Si blocca pure.

La cosa più confusione è che Motorola ha 24 MB, la stessa HTC desiderio. È 2.1 Implementazione della gestione della memoria meno efficiente? (ad esempio porta a una maggiore frammentazione?) o è la gestione della memoria peggio di tutti i telefoni Motorola? E allora perché lo fa HTC Hero con 2.2 schianto? Cosa c'è di più grande in HTC Desire di HTC Hero?

appare come OOM accade su telefoni più vecchi, ma che è l'unica cosa che ho capito finora.

Se OOM verifica solo su telefoni più vecchi che sono, diciamo, 5% del mercato, posso solo escludere 2.1 o un elenco più preciso dai dispositivi supportati da solo la raccolta di segnalazioni di crash ed escludendo tutto ciò che si è schiantato dalla lista di sostegno . Altrimenti sarei ora di far ridurre la tutte le mie immagini da qualche fattore costante (ad esempio 1,6), il che significherebbe ridimensionare tutti i 45 livelli che si sono giorni e giorni di progettazione e test, riposizionare elementi della GUI, ecc Anche dopo che, io' d ancora non essere sicuri, sui dispositivi la riduzione della dimensione totale di bitmap per un fattore di esempio 2 è sufficiente per Ooms evitare.

Qualche consiglio su questo? Devo impostare le opzioni specifiche per BitmapFactory? btw, la maggior parte delle immagini sono trasparenti pixel BG che, per quanto ho capito, non permettono loro di ottenere in formato 565.

Ho trascorso 2 giorni navigando qui e in altri luoghi, ma sono ancora in perdita.

Grazie.

È stato utile?

Soluzione

ho avuto a che fare con una versione più semplice del problema -. Abbiamo avuto 3 strati 2Mpix l'uno sopra l'altro, che, ovviamente, OOM a volte causato

Nel mio caso, invece di utilizzare 3 ImageViews uno sopra l'altro, mantenendo tutte le 6 MPix in memoria in ogni momento, ho mescolato manualmente gli strati, mantenendo così al massimo 4 Mpix in memoria alla volta (e solo 2 MPix a "riposo" - gli strati cambiato nella nostra applicazione).

Si tratta di un trade-off classico spazio-tempo - il sacrificio di efficienza (tempo) per la memoria guadagno (spazio). E 'stato un po' lento perché si doveva recycle() ogni bitmap dopo che ti hanno fatto con esso al fine di garantire la memoria è stata liberata.

Per quanto riguarda i Ooms incoerenti, probabilmente ha a che fare con la raccolta dei rifiuti. Si può supporre che il garbage collector è non-deterministico e quindi ogni pressione di memoria diventa non-deterministico, nonché (a seconda di quando l'ultimo GC calci).

La breve sintesi è, si deve essere molto, molto attenti con l'uso della memoria e non c'è modo intorno ad esso. *

* In teoria, si potrebbe allocare memoria fuori dal mucchio Dalvik utilizzando l'NDK e l'assegnazione direttamente dal sistema operativo. Si tratta di un enorme trucco e il ponte tra Dalvik e il tuo allocatore sarà piuttosto brutto.

Altri suggerimenti

In primo luogo è necessario trovare che cosa esattamente sta utilizzando tutta la memoria. Check this out. Forse si potrebbe voler riciclare bitmap, per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top