Carregando Imagens em J2ME?
-
06-09-2019 - |
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?.
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:
- 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.
- 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.
- 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 é.
- 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.