Pregunta

No soy tan nuevo para los conceptos presentes en J2ME, pero yo soy una especie de perezoso de una manera que no deben: Últimamente mi aplicación ha estado cargando las imágenes en la memoria, ya que eran dulces ...

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

y no estoy muy seguro de que es la mejor manera, pero funcionó bien en mi Motorola Z6, hasta anoche, cuando probé la aplicación en un viejo Samsung teléfono móvil y las imágenes incluso no carga y requiere de varios intentos de arranque el hilo a aparecer. La pantalla se queda en blanco, por lo que me di cuenta de que tiene que ser algo acerca de la carga de imágenes que no estoy haciendo bastante bien ... ¿Hay alguien que me pueda decir cómo hacer correctamente una rutina de carga en mi aplicación?.

¿Fue útil?

Solución

No estoy seguro exactamente lo que está buscando, pero el comportamiento que describes muchísimo sonidos como usted está experimentando una excepción OutOfMemory. Pruebe a reducir las dimensiones de las imágenes (el uso del montón se basa en la dimensión) y ver si el comportamiento cesa. Esto le permitirá saber si es realmente un problema OutOfMemory o alguna otra cosa.

Otros consejos:

    imágenes
  1. Carga de mayor a menor. Esto ayuda con la fragmentación del montón y permite el mayor espacio de almacenamiento dinámico de las imágenes más grandes.
  2. Unload (puesto a cero) en el orden inverso de cómo se carga y limpieza de la memoria después de hacerlo. Asegúrese de Thread.yield () después de llamar al GC.
  3. Asegúrese de que sólo cargar las imágenes que necesita. Descargar imágenes desde un estado en el que la aplicación ya no está en.
  4. Desde va a crear sprites que puede tener múltiples sprites para una imagen. Considerar la creación de una piscina en la imagen para asegurarse de que sólo carga la imagen una vez. A continuación, sólo señalar cada objeto Sprite de la imagen dentro de la piscina que requiere. Su ejemplo en su pregunta parece que sería más que probable que cargar la misma imagen en la memoria más de una vez. Eso es un desperdicio y podría ser parte del problema OutOfMemory.

Otros consejos

Uso de una imagen de película (un conjunto de imágenes en una dimensión se define en una imagen) y usar la lógica para tirar de ellos hacia fuera uno a la vez.

Debido a que un agrupan en una sola imagen, que está ahorrando espacio de cabecera por imagen y por lo tanto puede reducir la memoria utilizada.

Esta técnica se utilizó primero en MIDP dispositivos comprimidos 1.0 de memoria.

Utilizando el enfoque Fostah de no cargar imágenes una y otra vez, hice la siguiente clase:

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;
    }
}

Por lo tanto, cada vez que necesito una imagen que primero consulte la piscina para ello, o simplemente cargarlo en la piscina.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top