2015-05-11 6 views
-1

У меня есть приложение Java, в котором есть несколько JPanels, каждый из которых выполняет много рисунков, и я получаю alot проблем с производительностью. Я использую метод ниже, пытаясь не пострадать так много, чтобы просто нарисовать содержимое JPanels в BufferedImage только тогда, когда что-то на панели изменилось, а не делало это, когда главное окно вызывает перерисовку. Когда в каждой панели меняется несколько вещей, приложение замедляется, и анимация становится очень нервной.Painting BufferedImage Performance

Я проверяю CPU и его только на 5%, но обновления появляются очень нервно, когда происходит несколько обновлений. Есть ли что-то, что может повлиять на это, я ожидал бы только нервных проблем, когда процессор становится напряженным.

public class myClass extends JPanel { 
private BufferedImage bImage; 


private void updateImage() { 
    BufferedImage temp= new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics g = temp.getGraphics(); 
    Graphics2D g2 = (Graphics2D) g; 

    //Do lots and lots of drawing on g with other bufferedImages and lines and text etc 

    synchronized (bImage) { 
     bImage = temp; 
    } 
} 

public void paintComponent(Graphics g) { 
    synchronized (bImage) { 
     g.drawImage(bImage, 0, 0, this); 

    } 
} 
+0

Вы используете двойную буферизацию? - это может помочь – Toumash

+1

Это не выглядит кошерным для меня, когда вы не вызываете метод paintComponent супер и с вашей синхронизацией. Лучше, если вы создали и разместили [минимальную примерную программу] (http://sscce.org). –

+1

Как часто вы рисуете 'JPanel'? Вы используете фиксированный интервал? – GiantTree

ответ

0

Это не просто сказать, что проблема здесь, но если вы беспокоитесь о частоте кадров, то я предлагаю читать один из произведений Эндрю Дэвисона, в частности, главы два и три. Чертежные главы можно найти здесь: http://fivedots.coe.psu.ac.th/~ad/jg/

Хотя Swing рассчитан на легкий вес, если вы делаете необычное количество анимации с ним, есть дополнительные соображения. Вам потребуется время, когда ваш чертеж достигнет частоты кадров, периодически выдавайте и, возможно, даже запускайте таймер ИБП в дополнение к FPS. Это все еще возможно, и вы двигаетесь в правильном направлении.

Жаль, что я не могу больше помочь. Удачи.