2016-10-26 13 views
1

Я пытаюсь сделать игру в java и столкнулся с проблемой. Когда моя программа реплицирует мой JFrame, она требует много энергии от моего процессора, мне было интересно, есть ли какая-то вопиющая ошибка, которую я пропускаю или способ уменьшить использование ЦП.repanting 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

Из интереса, какой процессор вы используете, и что такое разрешение экрана? – sorifiend

+0

@sorifiend Это интеллект i5 7-го поколения, а экран 1920x1080 –

+0

Действительно ли перерисовка нужна 30/s? Почему бы просто не перекрасить огонь, если какое-либо государство изменится? –

ответ

1

Вы говорите, что вы уже ограничиваете цикл до 30 тиков в секунду, чем я не думаю, что ваша перекраска является причиной. У вас все еще много использования процессора, когда вы не перекрашиваете?

Если это так, я думаю, что ваш процессор переходит в вашу петлю, когда он ничего не делает между тиками, тем самым истощая вас. Это все, что я предполагаю, что вы используете поток и ничего не делаете с запасным временем потока.

+0

В программе используется около 60% процессора с методом repaint и ~ 30% без него. Я хотел бы сократить использование процессора в цикле, но я думал, что смогу решить одну проблему за раз. Кроме того, в методе, который я использовал для цикла, используется 'System.nanotime()' –

+0

@CharlieLandrigan. Использование, которое вы описываете, звучит нормально для стандартного или более низкого процессора. Один из способов уменьшить использование - это изменить только измененную/обновленную часть экрана (а не весь экран каждый раз), но для этого требуется дополнительная логика для отслеживания того, что нужно перерисовать. – sorifiend