2014-02-20 3 views
0

현재 2D 게임을 진행 중입니다. JPanel을 추가하는 JFrame이 있습니다. 어떤 이유로, 프로그램은 매초마다 점점 더 많은 메모리를 사용하고 있습니다. 내 컴퓨터가 처리 할 수 ​​없을 때까지 약 50,000K에서 시작하여 더 높아지고 높습니다. paint() 메서드가 내 JPanel에서 호출되고 있다고 생각했지만 JPanel을 추가하지 않으면 여전히 올라갑니다. 여기 내 JFrame의에 대한 코드는 다음과 같습니다너무 많은 메모리를 사용하는 JFrame

package main; 

import java.awt.Component; 

import javax.swing.JFrame; 

import level.Level; 

public class LostCloud { 

public static int width = 300; 
public static int height = 300; 
public static int scale = 2; 
public static String name = "Lost Cloud: Adventure 2D"; 
public static JFrame frame; 
public static JFrame levelFrame; 
public static Component center = null; 
public static Menu menu = new Menu(); 
public static Level level = new Level(); 

public static void main(String[] args) { 

    frame = new JFrame(name); 
    levelFrame = new JFrame(name); 

    // Set size and settings 
    frame.setSize(width * 2, height * 2); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(center); 
    // Set visible 
    frame.setVisible(true); 
    // Draw main menu panel 

    frame.add(menu); 
    menu.requestFocusInWindow(); 
    frame.validate(); 
} 

public void play() { 

    //Close main menu frame 
    frame.dispose(); 

    // Set size and settings 
      levelFrame.setSize(width * 3, height * 3); 
      levelFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      levelFrame.setResizable(false); 
      levelFrame.setLocationRelativeTo(center); 
      // Set visible 
      levelFrame.setVisible(true); 
      // Draw level panel 

      levelFrame.add(level); 
      level.requestFocusInWindow(); 
      levelFrame.validate(); 
     } 
} 

메뉴 :

package main; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

import entity.PlayerEntity; 

public class Menu extends JPanel { 

// Animations 

public int animating = 0; 
public int animatingType = 0; 

// Selected 

public int selectedOption = 0; 

//Images 

public BufferedImage background; 
public String backgroundLocation; 

private static final long serialVersionUID = 1L; 
private PlayerEntity player; 
public LostCloud main = new LostCloud(); 

public Menu() { 
    player = new PlayerEntity(400, 200); 
    addKeyListener(new MenuKeyListener()); 


    // Data file, stores name in it 

    File file = new File("data.txt"); 

    if (!file.exists()) { 
     try { 
      file.createNewFile(); 
      FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write("Cloud"); 
      bw.close(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
    } 

} 

public void updatePaint() { 
    this.repaint(); 
} 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    updatePaint(); 
    final Graphics2D g2 = (Graphics2D) g; 

    backgroundLocation = "res/background/main/main_background.png"; 
    try { 
     background = ImageIO.read(new File(backgroundLocation)); 
    } catch (IOException e) { 
     System.out.println("Unable to find file " + backgroundLocation + ",  printing stack trace!"); 
     e.printStackTrace(); 
    } 

    g2.drawImage(background, 0, 0, null); 

    Font font = null; 

    try { 
     font = Font.createFont(Font.TRUETYPE_FONT, new File(
       "res/font/BitTrip7(sRB).TTF")); 
    } catch (FontFormatException | IOException e) { 
     e.printStackTrace(); 
    } 

    font = font.deriveFont(40F); 
    g.setFont(font); 



    if (selectedOption == 0) { 
     g.setColor(Color.BLUE); 
     g.drawString("Play", LostCloud.width/2, 350); 
     g.setColor(Color.BLACK); 
     g.drawString("Quit", LostCloud.width/2, 400); 
    } else if (selectedOption == 1) { 
     g.setColor(Color.BLACK); 
     g.drawString("Play", LostCloud.width/2, 350); 
     g.setColor(Color.BLUE); 
     g.drawString("Quit", LostCloud.width/2, 400); 
    } 


    if (animatingType == 0) { 
     g2.drawImage(player.sprite[0].getScaledInstance(128, 128, 
       Image.SCALE_SMOOTH), player.x, player.y, null); 
    } else if (animatingType == 1) { 
     g2.drawImage(player.sprite[1].getScaledInstance(128, 128, 
       Image.SCALE_SMOOTH), player.x, player.y, null); 
    } 
    if (animating == 0) { 
     g2.drawImage(player.sprite[1], 10, 10, null); 
     animating = 1; 

     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       if (animatingType == 0) { 
        animatingType = 1; 
       } else if (animatingType == 1) { 
        animatingType = 0; 
       } 
      } 
     }, 0, 2 * 1000); 
    } 
} 

private class MenuKeyListener implements KeyListener { 

    public void keyPressed(KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.VK_UP) { 
      if (selectedOption == 1) { 
       selectedOption = 0; 
      } 
     } 

     if (event.getKeyCode() == KeyEvent.VK_DOWN) { 
      if (selectedOption == 0) { 
       selectedOption = 1; 
      } 
     } 

     if (event.getKeyCode() == KeyEvent.VK_ENTER) { 
      if (selectedOption == 0) { 
       main.play(); 
      } 
     } 


    } 

    public void keyReleased(KeyEvent arg0) { 

    } 

    public void keyTyped(KeyEvent arg0) { 

    } 

} 
} 

레벨 : ActionListeners를 추가로

package level; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.File; 
import java.io.IOException; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

import entity.PlayerEntity; 

public class Level extends JPanel implements ActionListener { 

private static final long serialVersionUID = 1L; 
public Timer time; 

// Player 

public PlayerEntity player; 

// Collisions 

public static Rectangle bottom = new Rectangle(0, 500, 1000, 200); 

public Level() { 
    this.setVisible(true); 
    this.setBackground(Color.DARK_GRAY); 
    player = new PlayerEntity(200, 200); 
    addKeyListener(new LevelKeyListener()); 

    time = new Timer(5, this); 
    time.start(); 
} 

public void updatePaint() { 
    this.repaint(); 
} 

public void paint(Graphics g) { 
    super.paint(g); 
    updatePaint(); 

    final Graphics2D g2 = (Graphics2D) g; 

    g2.fill(bottom); 
    if (player.attacking == 0) { 
     g2.drawImage(player.sprite[1].getScaledInstance(64, 64, 
       Image.SCALE_SMOOTH), player.x, player.y, null); 
    } else if (player.attacking == 1) { 
     g2.drawImage(player.sprite[2].getScaledInstance(64, 64, 
       Image.SCALE_SMOOTH), player.x, player.y, null); 
    } 



    g2.setColor(Color.BLACK); 
    Font font = null; 

    try { 
     font = Font.createFont(Font.TRUETYPE_FONT, new File(
       "res/font/BitTrip7(sRB).TTF")); 
    } catch (FontFormatException | IOException e) { 
     e.printStackTrace(); 
    } 

    font = font.deriveFont(30F); 
    g2.setFont(font); 
    g2.drawString(String.valueOf(player.getCharge()) + "%", 250, 100); 
    g2.drawString(String.valueOf(player.getHealth()) + "%", 250, 50); 

    g2.drawImage(player.getStatImage().getScaledInstance(256, 128, Image.SCALE_SMOOTH), 0, 0, null); 

    Rectangle chargeRect = new Rectangle(28, 74, player.getCharge() * 2 - 1, 24); 
    g2.setColor(Color.YELLOW); 
    g2.fill(chargeRect); 

    Rectangle healthRect = new Rectangle(28, 26, player.getHealth() * 2 - 1,  24); 
    g2.setColor(Color.RED); 
    g2.fill(healthRect); 
} 

private class LevelKeyListener implements KeyListener { 

    public void keyPressed(KeyEvent event) { 
     player.keyPressed(event); 

    } 

    public void keyReleased(KeyEvent key) { 
     player.keyReleased(key); 

    } 

    public void keyTyped(KeyEvent arg0) { 

    } 

} 

@Override 
public void actionPerformed(ActionEvent event) { 
    player.move(); 
    updatePaint(); 
    revalidate(); 
} 
} 
+1

[짧은, 자체 포함, 올바른 (컴파일 가능한), 예] (http://www.sscce.org/) – karlphillip

+0

[Visual VM] (http://visualvm.java)와 같은 프로파일 러를 사용해 보셨습니까? 그물/)? –

+0

@karlphillip이 코드는 모두 O_o입니다. JPanel 클래스는 호출되지 않기 때문에 필요하지 않습니다. 도움말 plz,이 고정하지 않고 내 게임을 계속할 수 없습니다 .. – LoafOfCat

답변

0

확인합니다. 일부 이벤트 또는 시간에 따라 new의 액션 리스너를 추가하면 (아무 것도하지 않으면 서 소리가 커지기 때문에) 매번 리스너를위한 메모리를 할당 할 수 있습니다. 이렇게하면 메모리 누수가 발생하여 오류가 발생할 때까지 메모리 요구 사항이 점진적으로 증가 할 수 있습니다. 인스턴스 리스너를 인스턴스 변수에 추가하여 인스턴스를 한 번만 인스턴스화하면됩니다. 나는 모든 코드를 볼 수 없으므로 프로젝트의 경험과 비슷한 문제로이 말을하고 있습니다.

관련 문제