Hi.
I have a number of Quad Spatials (8) rendered in an orthographic perspective each of width and height equal to that of the display windows.
Each of these Quads has a TextureState which in turn has a Texture. These 8 textures are assigned Dynamically created images using BufferedImage objects equal to the width and height of the display window (see code extract 1).
Extract 1:
// determines offset position for translating quad
offsetWidth = display.getWidth() * i;
offsetHeight = display.getHeight() * j;
// object handles dynamic creation of image for texturing.
background = new Background(display);
texture = new Texture();
texture.setApply(Texture.AM_MODULATE);
texture.setBlendColor(new ColorRGBA(1, 1, 1, 1));
texture.setFilter(Texture.MM_LINEAR);
texture.setImage(background);
texture.setMipmapState(Texture.FM_LINEAR);
textureState = display.getRenderer().createTextureState();
textureState.setTexture(texture);
quad = new Quad("Background quad", background.getWidth(), background.getHeight());
quad.setRenderState(textureState);
quad.setRenderQueueMode(Renderer.QUEUE_ORTHO);
quad.setLocalTranslation(new Vector3f((background.getWidth()/2) + offsetWidth, (background.getHeight()/2) + offsetHeight, 0));
quad.setLightCombineMode(LightState.OFF);
quad.getLocalRotation().set(0, 0, 0, 1);
quad.getLocalScale().set(1, 1, 1);
quad.setRenderState(alphaState);
quad.updateRenderState();
The Background class extends com.jme.image.Image and takes a display object (with the display windows width and height) and calculates the next highest power of 2 for both the width and height of the image (see code extract 2).
Extract 2:
power = 1;
do {
if(width <= (power*2)) {
break;
}
power *= 2;
} while(true);
if(width < (power*2)) {
width = (power*2);
}
power = 1;
do {
if(height <= (power*2)) {
break;
}
power *= 2;
} while(true);
if(height < (power*2)) {
height = (power*2);
}
This buffered image is then drawn on using the Graphics2D context and subsequently applied to the aforementioned Texture class (code extract 1). These 8 Quads are used to tile two background layers (4 Quads for each layer) horizontally and vertically.
The problem is, when executing the application with a display width and height of 1280 x 960 the application terminates with an OutOfMemory (heap) error. Im assuming this is because the next highest power of two for these values are 2048 x 1024.
So, is there no better (more efficient) method of drawing an image to an orthographic Quad. For example; tilling a smaller image than the display width/height (whilst maintaining its resolution) - either by dynamically creating a smaller image, or importing an image file, and tilling these? (And without increasing the heap size via VM args [-xms -xmx]) These images are never/will never be repainted during the execution of the application, unless the display size is altered.
How can a simple (alpha) image consume so much memory?