Pergunta

Eu não sou tão novo para os conceitos presentes no J2ME, mas eu sou uma espécie de preguiça de maneiras que eu não deveria: Ultimamente meu aplicativo tem sido carregamento de imagens na memória como eram doces ...

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

e eu realmente não estou certo de que é a melhor maneira, mas não funcionou bem no meu Motorola Z6, até ontem à noite, quando eu testei o aplicativo em um velho celular Samsung e as imagens não vai mesmo carga e exigir várias tentativas de começar o fio para aparecer. A tela ficou em branco, então eu percebi que ele tem que ser algo sobre o carregamento de imagem que eu não estou fazendo muito bem ... Existe alguém que pode me dizer como fazer corretamente a rotina de carregamento em meu aplicativo?.

Foi útil?

Solução

Eu não sei exatamente o que você está procurando, mas o comportamento que você descreve muitíssimo Parece que você está experimentando uma exceção OutOfMemory. Tente reduzir as dimensões de suas imagens (o uso de heap é baseada na dimensão) e veja se o comportamento cessa. Isso vai deixar você saber se é verdadeiramente um problema OutOfMemory ou outra coisa.

Outras dicas:

  1. Carregar imagens maior para a menor. Isso ajuda a fragmentação da heap e permite o maior espaço de pilha para as maiores imagens.
  2. Unload (definido como null) na ordem inversa de como você carregado e coleta de lixo depois de fazer isso. Certifique-se de Thread.yield () depois de chamar o GC.
  3. Certifique-se de só carregar as imagens que você precisa. imagens de descarregamento de um estado que a aplicação não está mais em é.
  4. Uma vez que você está criando sprites que você pode ter vários sprites para uma imagem. Considere a criação de uma piscina para se certificar de você só carregar a imagem de uma vez. Em seguida, basta apontar cada objeto Sprite para a imagem dentro da piscina que ele requer. Seu exemplo na sua pergunta parece como se fosse mais do que a carga provável a mesma imagem na memória mais de uma vez. Isso é um desperdício e poderia ser parte do problema OutOfMemory.

Outras dicas

Usando uma imagem do filme (um conjunto de imagens por uma dimensão definida em uma imagem) e usar a lógica para retirá-los um de cada vez.

Porque eles um agrupados em uma imagem, você está economizando espaço de cabeçalho por imagem e, portanto, pode reduzir a memória usada.

Esta técnica foi utilizada pela primeira vez em MIDP dispositivos constrangidos 1,0 memória.

Usando a abordagem Fostah de não carregar imagens mais e mais, eu fiz a seguinte 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;
    }
}

Assim, sempre que eu preciso de uma imagem que eu primeiro fazer a piscina para ele, ou apenas carregá-lo na piscina.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top