2016-10-26 89 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