2016-10-26 45 views
1

我想在java中制作游戏并遇到问题。当我的程序重新绘制我的JFrame时,它需要CPU的很多能量,我想知道是否有一些我忽略的明显错误或者减少CPU使用率的方法。重新绘制JPanel吃掉CPU

Frame.java

public class Frame extends JFrame { 
    JFrame frame; 
    public static Panel panel; 

    public void makeFrame() { 
     frame = new JFrame("Game"); 
     panel = new Panel(); 
     panel.init(); 

     frame.setSize(1000, 1000); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setVisible(true); 
     frame.add(panel); 
    } 
} 

GameLoop.java

public class GameLoop { 
//render gets called 30 times per second 
    private void render() { 
     Frame.panel.repaint(); 
    } 
} 

Panel.java

public class Panel extends JPanel { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     mvmt.drawCha(g2d); //mvmt is an instance of Movement 
    } 
} 

Movement.java

public class Movement { 
    public void drawCha(Graphics2D g2d) { 
     g2d.drawImage(charImg, x , y, x + 40 , y + 40, 0, 0, 17, 28, null); 
    } 
} 

在此先感谢您的帮助!

+0

出于兴趣你正在使用哪种CPU,屏幕分辨率是多少? – sorifiend

+0

@sorifiend这是一个英特尔i5第7代,屏幕是1920x1080 –

+0

重新绘制真的需要30/s?如果任何状态改变,为什么不只是重新喷漆? –

回答

1

你说你已经将循环限制为每秒30滴,比我认为你的重新绘制不是原因。在不重新绘制时,你仍然有很多CPU使用情况?

如果是这样的话,我认为你的cpu会进入你的循环,当它在滴答声之间没有任何作用时,就会消耗你的cpu。这一切,我假设你正在使用一个线程,并没有在线程的空闲时间做任何事情。

+0

该程序使用约60%的CPU与重绘方法和约30%没有它。我想减少循环的CPU使用率,但我认为我一次会解决一个问题。另外,我用于循环的方法使用'System.nanotime()' –

+0

@CharlieLandrigan您描述的用法听起来对于标准或低端CPU来说听起来很正常。减少使用量的一种方法是仅重新绘制屏幕的已更改/更新部分(而不是每次都是整个屏幕),但是确实需要一些额外的逻辑来跟踪要重新绘制的内容。 – sorifiend