Heap space issues when getting java images

In the introduction to this, I'm a beginner programmer looking to add animation to a simple game I've created. I made a separate class to test my animations and every image was displayed except two. My current code:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

import javax.swing.JApplet;

public class GooAnimation extends JApplet implements Runnable {

Image[] eastbarf = new Image[22];
Image[] east2barf = new Image[10];
boolean enter = false;
int counter = 0;
Image img1;
URL url;

public void init() {

    eastbarf[0] = getImage(getDocumentBase(), "eastbarf1.png");
    eastbarf[1] = getImage(getDocumentBase(), "eastbarf2.png");
    eastbarf[2] = getImage(getDocumentBase(), "eastbarf3.png");
    eastbarf[3] = getImage(getDocumentBase(), "eastbarf4.png");
    eastbarf[4] = getImage(getDocumentBase(), "eastbarf5.png");
    eastbarf[5] = getImage(getDocumentBase(), "eastbarf6.png");
    eastbarf[6] = getImage(getDocumentBase(), "eastbarf7.png");
    eastbarf[7] = getImage(getDocumentBase(), "eastbarf8.png");
    eastbarf[8] = getImage(getDocumentBase(), "eastbarf9.png");
    eastbarf[9] = getImage(getDocumentBase(), "eastbarf10.png");
    eastbarf[10] = getImage(getDocumentBase(), "eastbarf11.png");
    eastbarf[11] = getImage(getDocumentBase(), "eastbarf12.png");
    eastbarf[12] = getImage(getDocumentBase(), "eastbarf13.png");
    eastbarf[13] = getImage(getDocumentBase(), "eastbarf14.png");
    eastbarf[14] = getImage(getDocumentBase(), "eastbarf15.png");
    eastbarf[15] = getImage(getDocumentBase(), "eastbarf16.png");
    eastbarf[16] = getImage(getDocumentBase(), "eastbarf17.png");
    eastbarf[17] = getImage(getDocumentBase(), "eastbarf18.png");
    eastbarf[18] = getImage(getDocumentBase(), "eastbarf19.png");
    eastbarf[19] = getImage(getDocumentBase(), "eastbarf20.png");
    eastbarf[20] = getImage(getDocumentBase(), "eastbarf21.png");
    eastbarf[21] = getImage(getDocumentBase(), "eastbarf22.png");

    east2barf[0] = getImage(getDocumentBase(), "east2barf1.png");
    east2barf[1] = getImage(getDocumentBase(), "east2barf2.png");
    east2barf[2] = getImage(getDocumentBase(), "east2barf3.png");
    east2barf[3] = getImage(getDocumentBase(), "east2barf4.png");
    east2barf[4] = getImage(getDocumentBase(), "east2barf5.png");
    east2barf[5] = getImage(getDocumentBase(), "east2barf6.png");
    east2barf[6] = getImage(getDocumentBase(), "east2barf7.png");
    east2barf[7] = getImage(getDocumentBase(), "east2barf8.png");
    east2barf[8] = getImage(getDocumentBase(), "east2barf9.png");
    east2barf[9] = getImage(getDocumentBase(), "east2barf10.png");

}

@Override
public void run() {
    while (true) {
        repaint();
        try {
            Thread.sleep(1000);

        } catch (InterruptedException e) {

        }
    }

}

@Override
public void start() {
    Thread thread = new Thread(this);
    thread.start();
}

@Override
public void paint(Graphics g) {
    // for (int i = 0; i < eastbarf.length; i++) {
    if (enter) {
        if (counter < 10) {
            g.setColor(Color.WHITE);
            g.drawRect(0, 0, 10000, 10000);
            g.fillRect(0,0,10000,10000);
            g.drawImage(east2barf[counter], 300, 0, 1000, 1000, this);
            System.out.println(eastbarf[counter].getHeight(null));
        }
        if (counter == 10) {
            counter = 0;
            enter = false;
        }
    }
    if (!enter) {
        if (counter < 22) {
            // if ((i - 1)%2 == 1) {
            //

            // }
            System.out.println(counter);
            if (eastbarf[counter] == null) {
                System.out.println("Its null!");
            }
            // if (counter % 2 == 1) {
            // g.setColor(Color.YELLOW);
            // }
            // else {
            // g.setColor(Color.MAGENTA);
            // }
            g.setColor(Color.WHITE);
            g.drawRect(0, 0, 10000, 10000);
            g.fillRect(0,0,10000,10000);
            g.drawImage(eastbarf[counter], 0, 0, 1000, 1000, this);
            System.out.println(eastbarf[counter].getHeight(null));

            // }
        }

        // }

        if (counter > 21) {
            enter = true;
            counter = 0;
        }
    }
    counter += 1;
    // g.drawImage(img1, 0, 0, null);


}

      

}

I am getting two errors that say:

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space

      

I did, however, look at how to increase the eclipse heap space and double it. I'm not sure if this is adequate. Ideally I would have 4 buff lists of the same length and 4 2barf. As you can see, I have stripped all of the image names to make it easier to conceptualize. I'm pretty new and I don't know how to best practice Image wise or JApplet / Swing. I would be grateful if someone could understand why I am losing on two images. The images that are missing are the sixth and eighth images in eastbarf2. I would really appreciate some help. Thanks Edit: The images are about 80-150 kb each. In eclipse, these are the commands that I paste in the arguments part in the launch configurations. -Xms1024M -Xmx2048M. They don't change anything.

+3


source to share


1 answer


g.drawRect(0, 0, 10000, 10000);
g.fillRect(0,0,10000,10000);
g.drawImage(east2barf[counter], 300, 0, 1000, 1000, this);

      

you fill 10k x 10k pixels on the screen and after that you draw 1000 x 1000 images, this will surely blow your memory. If you need a large map for your game, you should implement an orthogonal camera mapset map that will only display the screen the player is on, for example change the whole image to BufferedImage and just try this:

[...]

    g.drawRect(0, 0, 800, 600);
    g.fillRect(0,0,800,600);
    g.drawImage(east2barf[counter], 300, 0, east2barf[counter].getWidth(), east2barf[counter].getHeight(), this);

      



[...]

        g.setColor(Color.WHITE);
        g.drawRect(0, 0, 800, 600);
        g.fillRect(0,0,800,600);
        g.drawImage(eastbarf[counter], 0, 0, east2barf[counter].getWidth(), east2barf[counter].getHeight(), this);

      

[...]

+1


source







All Articles