Java3D: как избежать OutOfMemoryError при использовании текстур - PullRequest
1 голос
/ 03 апреля 2012

Я создаю несколько визуальных объектов в цикле:

...
Package packet; // a visual packet
for(int i = 0; i < numberOfSteps; i++){
  packet = new Package(packetSize, packetSize, packetSize);

  // position, rotate, etc. and add to scene graph
}
...

Пакет - это простой куб с текстурой.Конструктор пакета выглядит следующим образом:

public Package(float x, float y, float z) {
    Appearance appear = new Appearance();
    BufferedImage filename = null;

    try {
        filename = ImageIO.read(getClass().getResource("package.jpg"));
    } catch (IOException e) {
                    e.printStackTrace();
        System.exit(1);
    }

    TextureLoader loader = new TextureLoader(filename);
    ImageComponent2D image = loader.getImage();
    Texture2D texture = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
            image.getWidth(), image.getHeight());
    texture.setImage(0, image);
    appear.setTexture(texture);
    textureCube = new Box(x, y, z, Box.GENERATE_TEXTURE_COORDS, appear);
}

Так что я загружаю одну и ту же текстуру снова и снова в цикле, что в конечном итоге вызывает ошибку OutOfMemoryError.Есть ли способ избежать / оптимизировать это?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

Наиболее очевидная оптимизация - это кэширование ваших BufferedImage:

class ImageProvider{

   private static Map<String, Image> images = new HashMap<String, Image>();

   public static Image getImage(String filename){
       if(!images.contains(filename))
           try {
              images.put(filename, ImageIO.read(ImageProvider.class.getResource(filename));
           } catch (IOException ignore){
              //will return null if image cannot be loaded
           }

       return images.get(filename);
   }
}

В зависимости от манипуляций, которые вы делаете позже, вы также можете кэшировать свои ImageComponent2D объекты и / или ваши Texture2D объекты.

0 голосов
/ 03 апреля 2012

Так что короткий ответ - да.Вы можете оптимизировать, похоже, если я не ошибаюсь, что теоретически вы можете повторно использовать тот же самый объект "Package" и просто изменить некоторые параметры в нем, чтобы уменьшить использование памяти, вы загружаете эту текстуру несколько раз в память для пакетов, которые высоздать

0 голосов
/ 03 апреля 2012

Вместо того, чтобы создавать новую текстуру снова и снова, попробуйте переставить ваш код, чтобы он снова использовал одну и ту же текстуру.Таким образом, текстуру необходимо загрузить только один раз, и из-за этого она использует меньше памяти.

...