2012-04-03 60 views
1

我在循环创造了多种视觉对象以避免OutOfMemoryError异常:Java3D的:如何同时使用纹理

... 
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

最明显的优化是缓存你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

而不是一遍又一遍地创建一个新的纹理,尝试重新安排您的代码,以便它重用相同的纹理。这样,纹理只需要加载一次,并因此使用更少的内存。

0

所以简短的回答是肯定的。你可以进行优化,除非我误以为理论上你可以重复使用同一个“Package”对象,只是改变其中的一些参数以减少内存使用,你可以多次将该纹理加载到内存中创建

相关问题