2012-03-31 7 views
6

Sto sviluppando un gioco su android.Facile difesa a torre. Sto usando la vista di superficie. Sto usando alcune immagini come bitmap. (Fogli elettronici, tileset, pulsanti, sfondi, efetti vs.) Ora le immagini sono quasi 5-6 mb.E ottengo questo errore quando eseguo il mio gioco:Le dimensioni bitmap superano il budget VM durante lo sviluppo del gioco

formato bitmap supera VM bilancio

19.464.192 byte allocazione esterna troppo grande per questo processo.

io chiamo le immagini del genere

BitmapFactory.decodeResource(res, id) 

e ho messo a matrice. Non riesco a ridimensionare le immagini. Le sto utilizzando tutte. ho provato che

options.inPurgeable=true; 

e funziona ma l'immagine viene caricata carico molto slowly.I uno spritesheet con quello e quando è carico, ottengo molto basso fps.

Cosa posso fare?

risposta

0

Non sono un dev di gioco, tuttavia mi piacerebbe pensare di conoscere Android abbastanza.

Il caricamento delle immagini della dimensione è quasi certo di generare errori. Perché le immagini hanno dimensioni del file?

C'è un esempio su http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/. Se noti che ha uno sprite di esplosione di soli ~ 200Kb. Anche un'immagine più dettagliata non richiederebbe molto più spazio per i file.

OK alcuni suggerimenti:

  • viene caricata tutte tuoi spritesheets su un singolo foglio o è ogni spritesheet in un file separato? Se sono tutti su uno vorrei dividerli.

  • ridurre la risoluzione delle immagini, un dispositivo Android è portatile e alcuni hanno solo uno schermo a bassa risoluzione. Ad esempio l'HTC Wildfire ha una risoluzione di 240x320 (dispositivo LDPI) ed è piuttosto un dispositivo comune . Non hai specificato le dimensioni dell'immagine, quindi non possiamo essere sicuri se questo è pratico.

Infine; Non sono un programmatore di giochi ma ho trovato questo tutorial (parte della stessa serie) piuttosto illuminante - http://p-xr.com/android-tutorial-2d-canvas-graphics/. Mi chiedo se stai applicando un modello che non è appropriato per Android, tuttavia senza codice non posso dire.

qualcosa di giusto un po 'fuori tema, ma degno di nota ...

persone sotto stima il potere della vista. Mentre c'è una certa quantità di logica nell'usare un SurfaceView, la Vista standard farà un bel po 'da sola. Un SurfaceView più di frequente richiede l'esecuzione di un thread sottostante (che dovrai configurare tu stesso) per farlo funzionare.A View tuttavia chiama onDraw(), che può essere utilizzato in vari modi, incluso il metodo postinvalidate() (vedere What does postInvalidate() do?).

In ogni caso potrebbe essere utile controllare questo tutorial http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/. Personalmente, è stato un eccellente esempio di visualizzazione personalizzata e di cosa puoi fare con loro. Ho riscritto alcune sezioni e ho creato un'app per l'orologio da tasca.

+0

Ringrazio per il tuo aiuto ma non riesco a risolverlo. Io uso il grande spritesheet perché ci sono troppe animazioni. Ad esempio, questo è lo spritesheet di una creatura dal mio gioco: http://nafiz.in/bigeye.png Io uso le galassie e sto usando questi spritesheets a grandezza intera. Firsly devo lavorarlo sul mio dispositivo. Probabilmente, c'è un limite di 7-8 mb per bitmap. Ricerco ancora e ho trovato che per risolvere questo problema devo usare jni o opengl. Ma a quel punto, non posso usarli. Forse un altro progetto. Rimuoverò alcune animazioni e lavoro sulla gestione dell'heap. –

2

Ho avuto anche questo problema; non c'è davvero altra soluzione se non quella di ridurre il numero/dimensione dei bitmap che hai caricato in una volta. Alcuni dispositivi Android meno recenti allocano solo 16MB all'heap per l'intera applicazione e le bitmap vengono archiviate in memoria non compresse una volta caricate, quindi non è difficile superare 16 MB con sfondi grandi, ecc. (Una bitmap 854x480 a 32 bit è circa 1.6MB non compresso.)

Nel mio gioco sono stato in grado di aggirarlo caricando solo bitmap che stavo per utilizzare nel livello corrente (ad esempio, ho un singolo oggetto Bitmap per lo sfondo che viene ricaricato da risorse ciascuna tempo cambia, piuttosto che mantenere più Bitmap in memoria. Io mantengo solo un int che tiene traccia di quale risorsa ho caricato attualmente.)

Il tuo foglio di sprite è enorme, quindi penso che tu abbia ragione che avrai bisogno di riduci le dimensioni delle tue animazioni. In alternativa, il caricamento da risorse è veloce, quindi potresti essere in grado di fare qualcosa come caricare solo la striscia di animazione per la direzione corrente del personaggio, e farlo sospendere leggermente mentre gira mentre lo sostituisci con la nuova striscia di animazione. Questo potrebbe essere complicato però.

Inoltre, consiglio vivamente di testare la tua app sull'emulatore con un heap di VM impostato su 16mb, per assicurarti di aver risolto il problema per tutti i dispositivi. (Di solito l'emulatore è impostato su 24mb, quindi è facile che non venga testato e generi alcune recensioni a 1 stella dopo il rilascio.)