Autore Topic: Heap alle stelle. GC_FOR_ALLOC e GC_CONCURRENT  (Letto 434 volte)

Offline gorgo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s2
  • Sistema operativo:
    Win7 / Linux Mint 14
Heap alle stelle. GC_FOR_ALLOC e GC_CONCURRENT
« il: 10 Aprile 2013, 00:52:48 CEST »
0
Sto realizzando un'app/gioco in cui sfrutto delle animazioni tramite SpriteSheet visualizzata in una canvas di una SurfaceView.
Sono vincolato con le API 10 di Google.
In parallelo nascondo o rendo visibile una ListView di dialoghi che, se selezionati, vengono visualizzati per 5s sullo schermo tramite una drawText.

Il gioco in sè è fluido, ma il LogCat è pieno di chiamate al GC e ho l'heap sul limite dell'OutofMemory :(



Questa è un'immagine del debugger di Eclipse.

e qui: http://pastebin.com/fG8Ji0st trovate un esempio del mio LogCat.

Il codice è così strutturato:

La onCreate() setta il layout, inizializza il GameEngine (che si preoccupa di inizializzare tutto il MVC), e fa partire il thread del GameLoop.
http://pastebin.com/MDVacGJi Pirates.Java

La Surface chiama solo i suoi costruttori.
Il costruttore di GameEngine non fa altro che chiamare i vari new dei modelli, dei controller e dei renderer.

Qui un esempio di Renderer: http://pastebin.com/ryXh6eJr GuybrushRenderer.java
Utilizzo 3 Renderer: Uno per lo sfondo/fps, uno per Guybrush e uno per il pirata (Ovviamente vengono inizializzati solo una volta in tutto il gioco).

L'inizializzazione di SpriteTile (che carica le spriteSheet) avviene caricando la sprite con

Codice (Java): [Seleziona]
InputStream is = context.getResources().openRawResource(spriteid);
                tileSheet = BitmapFactory.decodeStream(is);

e viene parsato l'xml con le coordinate dei frame.

Qui la classe che si occupa di stampare a video le scritte: http://pastebin.com/sVG26Gdj Text.Java

Il Ciclo del Gameloop è una serie di chiamate update() (che modificano i modelli) e di draw() che disegnano sulla canvas:
http://pastebin.com/gdqQbJTu MainThread.Java

Riuscite a darmi una mano a ottimizzare la memoria usata?


Per ora sto utilizzando pure una spritesheet molto piccola.

e


ma non mi sembra di vedere chissà che miglioramento rispetto a una spritesheet di 1024x1117 (Sprite contenente tutte le animazioni del pirata)

Grazie mille per l'eventuale aiuto :(
Sono a disposizione per chiarimenti!
« Ultima modifica: 10 Aprile 2013, 01:02:30 CEST da gorgo »