Hallihallo,
ich bin schon seit längerem an einem java-projekt dran. Es geht um einen supermario-klon.
Ich habe ein JPanel in einem JFrame. Die verwaltung (also neuzeichnen, usw.) läuft in einem Thread ab, in parallel dazu laufenden Threads werden Positionen von Level-Bildern und Koopas, etc. berechnet. Immer wenn ich mein Fenster(JFrame) minimiere, dann liegt die CPU-Auslastung (QuadCore) bei etwa 20%. Wenn das Fenster jedoch sichtbar ist, dann dreht der Lüfter der CPU immer höher, mein laptop wird immer heißer, und das obwohl mein JPanel eigentlich nicht viel zu tun hat. (2 meiner Prozessorkerne laufen bei sichtbarem fenster auf >90%). Ich poste mal den quellcode meines JPanels:
Wie gesagt, ich bin mir ziemlich sicher, dass die CPU-auslastung hauptsächlich von der grafischen komponente her kommt, denn die Kerne, unter denen der JPanel-Thread läuft arbeitet nur, wenn das fenster sichtbar ist.
Hat jemand erfahrung mit meinem Problem und kann mir tipps geben, wie ich das JPanel noch weiter entlasten kann?
Gruß Stormblade
ich bin schon seit längerem an einem java-projekt dran. Es geht um einen supermario-klon.
Ich habe ein JPanel in einem JFrame. Die verwaltung (also neuzeichnen, usw.) läuft in einem Thread ab, in parallel dazu laufenden Threads werden Positionen von Level-Bildern und Koopas, etc. berechnet. Immer wenn ich mein Fenster(JFrame) minimiere, dann liegt die CPU-Auslastung (QuadCore) bei etwa 20%. Wenn das Fenster jedoch sichtbar ist, dann dreht der Lüfter der CPU immer höher, mein laptop wird immer heißer, und das obwohl mein JPanel eigentlich nicht viel zu tun hat. (2 meiner Prozessorkerne laufen bei sichtbarem fenster auf >90%). Ich poste mal den quellcode meines JPanels:
Java:
public class GamePanel extends JPanel implements Runnable{
private LevelLoader lvloader;
private GameManager parent;
private Thread thread_1;
private BufferedImage world, profileMap;
private Point[][][] levelProfile;
private long fps=50, sleeptime;
public GamePanel(GameManager gm)
{
this.parent = gm;
this.repaint();
}
public void startMe()
{
thread_1 = new Thread(this);
thread_1.start();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.decode("#00BFFF"));
g.fillRect(0,0,2000,1000);
g.drawImage(world,0,0,null);
g.drawImage(profileMap,0,0,null);
for(int i=0; i<parent.getEntityList().size(); i++){
g.setColor(Color.red);
g.fillOval(parent.getEntityList().elementAt(i).getX(),parent.getEntityList().elementAt(i).getY(),
parent.getEntityList().elementAt(i).getWidth()*60,parent.getEntityList().elementAt(i).getHeight()*60);
g.drawRect(64, 64*7, 64, 64);
}
}
public void run()
{
long timebefore = System.currentTimeMillis();
long timeafter,delay;
while(true){
timebefore = System.currentTimeMillis();
this.repaint();
timeafter = System.currentTimeMillis();
sleeptime = 1000/fps-timeafter-timebefore;
try{Thread.sleep(sleeptime);}catch(Exception e){}
}
}
}
Hat jemand erfahrung mit meinem Problem und kann mir tipps geben, wie ich das JPanel noch weiter entlasten kann?
Gruß Stormblade