2009-05-28 4 views
2

Я не настолько знаком с понятиями, присутствующие на J2ME, но я вроде ленивы способами, которыми я не должен: В последнее время мое приложение было загрузка изображений в память, как они были конфетой ...Загрузка изображений в J2ME?

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

, и я не уверен, что это лучший способ, но он отлично работал в моей Motorola Z6, до прошлой ночи, когда я тестировал приложение в старом сотовом телефоне Samsung, и изображения обычно не загружаются и требуют нескольких попыток запуска нить для отображения. Экран был оставлен на белом фоне, поэтому я понял, что это должно быть что-то с загрузкой изображения, что я не очень хорошо ... Есть ли кто-нибудь, кто может сказать мне, как правильно настроить загрузку в моем приложении ?.

+0

Не могли бы вы быть более ясными в отношении того, чего вы пытаетесь достичь из образа или чего-то еще. – Ram

ответ

4

Я не уверен, что именно вы ищете, но поведение, которое вы описываете, очень похоже на то, что вы испытываете исключение OutOfMemory. Попробуйте уменьшить размеры ваших изображений (использование кучи основано на измерении) и посмотреть, прекращается ли поведение. Это даст вам знать, действительно ли это проблема OutOfMemory или что-то еще.

Другие советы:

  1. Загрузка изображений наибольшего к наименьшему. Это помогает с фрагментацией кучи и обеспечивает наибольшее пространство кучи для самых больших изображений.
  2. Выгрузите (установите значение null) в порядке, обратном порядку загрузки и сбора мусора после этого. Убедитесь, что Thread.yield() после вызова GC.
  3. Убедитесь, что вы загружаете только те изображения, которые вам нужны. Выгрузите изображения из состояния, в котором приложение больше не используется.
  4. Поскольку вы создаете спрайты, у вас может быть несколько спрайтов для одного изображения. Подумайте о создании пула изображений, чтобы убедиться, что вы загружаете только одно изображение. Затем просто укажите каждый объект Sprite на изображение в пределах пула, который он требует. Ваш пример в вашем вопросе кажется, что вы более чем вероятно загрузите один и тот же образ в память более одного раза. Это расточительно и может быть частью проблемы OutOfMemory.
+1

благодарит Fostah! действительно полезный, объект пула изображений, я использовал его раньше, но используя Java2D в настольной игре, так что это не будет проблемой, чтобы сделать это снова. Мне все еще нужно немного отполировать, мне нужно знать, как структурировать приложение. В последнее время мое приложение нитевидно, у меня есть два холста, каждый из которых реализует Runnable, один для меню и другие для игрового процесса, я делаю это? – fixmycode

+0

Мои игры J2ME всегда состояли из 1 холста и нескольких состояний игры. Затем run() для холста имеет цикл обновления. Наличие нескольких экземпляров Canvas действительно не нужно, учитывая, что государства никогда не существуют в одно и то же время. Посмотрите J2ME Game Programming от Martin Wells. Это отличная книга и будет очень полезна для вас. – Fostah

0

Использование Fostah подход не загружаются изображения снова и снова, я сделал следующий класс:

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

Таким образом, всякий раз, когда мне нужен образ, который я первый попросить бассейн для него, или просто загрузить его в бассейн.

1

Использование изображения фильма (набор изображений по определенному размеру на одном изображении) и использование логики для вытягивания их по одному.

Поскольку они сгруппированы в одно изображение, вы сохраняете пространство заголовка на изображение и, таким образом, можете уменьшить используемую память.

Эти методы были впервые использованы в устройствах с ограничением памяти MIDP 1.0.

 Смежные вопросы

  • Нет связанных вопросов^_^