2014-12-07 45 views
3

为了说明这一点,我是一位初学者程序员,希望为我制作的简单游戏添加动画。我做了一个单独的课来测试我的动画,并且每个图像都显示为两个。 我当前的代码是:获取java图像的堆空间问题

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


} 

}

我得到两个错误是说:

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

我已经然而抬起头来如何增加日食堆空间,并增加了一倍它。我不确定这是否足够。理想情况下,我会有4个相同长度的barf列表和4个2barf列表。正如你所看到的,我已经把所有图片的名字分开了,以便更容易的概念化。我很新,并没有意识到最佳做法图像明智或JApplet/Swing的东西。如果有人能帮忙弄清楚为什么我在两张图片上输了,我将不胜感激。缺少的图像是eastbarf2中的第六和第八张图像。 我真的很感谢一些帮助。 谢谢 编辑: 图像是每个约80-150 kb。在eclipse中,这些是我放入运行配置参数部分的命令。 -Xms1024M -Xmx2048M。他们似乎没有改变任何东西。

+1

多大的图像? – BitNinja 2014-12-07 23:02:39

+1

堆有多大? [配置文件](http://stackoverflow.com/q/2064427/230513)了解详细信息。 – trashgod 2014-12-07 23:10:24

+0

我添加了垃圾信息,你认为只用这些就能解决问题吗? – eweiner 2014-12-08 22:40:24

回答

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

您在屏幕上填充10k x 10k像素,然后绘制尺寸为1000 x 1000的图像,它肯定会打击您的记忆。如果你想为你的游戏大地图,你必须实现与正交相机的地形设置地图,将仅呈现在屏幕的球员都在,例如改变所有图片设置为BufferedImage,只是尝试:

[.. ]

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

[...]