Domanda

Io non sono così nuovo ai concetti presenti sul J2ME, ma io sono una sorta di pigra in modi che non avrei: Ultimamente la mia app è stata caricando le immagini nella memoria come fossero caramelle ...

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

e io non sono davvero sicuro che sia il modo migliore, ma ha funzionato bene nel mio Motorola Z6, fino a ieri sera, quando ho provato l'applicazione in un vecchio Samsung cellulare e le immagini abituato anche carico e richiedono parecchi tentativi di partenza il filo di presentarsi. Lo schermo è stato lasciato su bianco, così ho capito che deve essere qualcosa sul caricamento di immagini che non sto facendo abbastanza bene ... C'è qualcuno che può dirmi come fare correttamente una routine di carico nella mia app?.

È stato utile?

Soluzione

Non sono sicuro esattamente quello che stai cercando, ma il comportamento che descrivi moltissimo suona come si sta verificando un'eccezione OutOfMemory. Provare a ridurre le dimensioni delle immagini (utilizzo di heap si basa sulla dimensione) e vedere se il comportamento cessa. Questo ti consente di sapere se è veramente un problema OutOfMemory o qualcos'altro.

Altri suggerimenti:

    immagini
  1. Carica grande al più piccolo. Questo aiuta con heap frammentazione e consente il più grande spazio heap per le più grandi immagini.
  2. Unload (impostato su null) in ordine inverso di come si carica e spazzatura raccogliere dopo averlo fatto. Assicurati di Thread.yield () dopo aver chiamato il GC.
  3. Assicurati di caricare solo le immagini che avete bisogno. Scaricare le immagini da uno stato che l'applicazione non è più in.
  4. Dal momento che si sta creando sprite è possibile avere più sprites per una sola immagine. Considerare la creazione di una piscina immagine per assicurarsi che si carica solo l'immagine una volta. Poi basta puntare ciascun oggetto Sprite all'immagine all'interno della piscina che richiede. Il tuo esempio nella tua domanda Sembra che si sarebbe più che probabile caricare la stessa immagine in memoria più di una volta. Questo è uno spreco e potrebbe essere parte del problema OutOfMemory.

Altri suggerimenti

Uso di un'immagine di pellicola (una serie di immagini da una dimensione definita in un'immagine) e usare la logica per tirare fuori uno alla volta.

Perché un raggruppate in un'unica immagine, che si sta salvando intestazione spazio per immagine e quindi in grado di ridurre la memoria utilizzata.

Questa tecnica è stata utilizzata in primo MIDP 1.0 dispositivi vincolati memoria.

Utilizzando l'approccio Fostah di non caricare immagini più e più volte, ho fatto la seguente classe:

public class ImageLoader {
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source){
        if(pool.get(source) != null) return (Image) pool.get(source);
        try {
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
        } catch (IOException e){
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        }
        return null;
    }
}

Così, ogni volta che ho bisogno di un'immagine in primo luogo ho chiesto la piscina per esso, o semplicemente caricarla nella piscina.

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