2014-12-16 1 views
1

Как и в моих последних сообщениях, извинения, но гораздо менее длинные. В основном мне интересно, какой оптимальный вариант для оптимизации перерисовки на JFrame/JPanel, когда каждый вызов перерисовывается, только небольшая часть экрана будет перерисована.Графика Java: setClip vs clipRect vs repaint (int, int, int, int)

Также, помимо перегрузки repaint, я не на 100% о том, как реализовать setClip или clipRect. Насколько я понимаю, они используются при переопределении краски или обновлении? Смотрите ниже некоторого кода:

public class AquaSim extends JPanel { 
//variables 
//other methods... 
    public void paint (Graphics g) { 
     super.paintComponent(g); //needed? 
     Graphics2D g2d = (Graphics2D) g; 

     //Draws the land area for penguins. 
     g2d.setColor(new Color(121,133,60)); 
     g2d.fill(land); 
     g2d.setColor(Color.BLUE); 
     g2d.fill(sea); 

     drawCreatures(g2d); 
} 
    public void drawCreatures(Graphics2D g2d) { 
     for (Creature c : crlist) //a list of all alive creatures { 
      //each creature object stores its image and coords. 
      g2d.drawImage(c.createImage(txs,tys), c.getPos(1).width, c.getPos(1).height, this); 
     } 
    } 
} 

В идеале я предпочел бы не иметь в цикле, хотя каждое существо объекта каждый запрос перекрашивать, который является частью причины для этого поста. Я не знаю, будет ли способ отправить текущее существо, которое будет нарисовано, чтобы нарисовать или переопределить краску в классе Существо, чтобы заставить его привлечь себя к графическому объекту в основном классе. немного больше кода ...

private class Creature implements ActionListener { 
//variables & other methods 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (getState()!=State.DEAD) { 
       move(); 
       repaint(); //<---Would rather set clipping area in paint/update. x,y,w,h needs to include ICON & INFO BOX. 
       //repaint(gx,gy,getPos(1).width,getPos(1).height); 
      } 
      else anim.stop(); 
     } 
//... 


    public void move() { 
    //Determines how it will move and sets where to here by updating its position that is used in drawCreatures. 
    } 
} 

Поэтому любые предложения, какие бы наиболее эффективным способом использовать? В виду, что перекраска будет многократно называться многими объектами/существами, то есть много раз в секунду, поэтому я не хочу, чтобы она перерисовывала каждый на экране каждый запрос на перерисовку.

+0

Свинг полностью способен многократно перерисовывать много объектов на современном компьютере. Как правило, в анимации Swing объекты несут ответственность за рисование. Код чертежа находится в классах моделей, но выполняется как часть представления, поддерживая разделение проблем Model/View/Controller. –

+0

Действительно, я ожидаю, что Менеджер перерисовки объединит многие из запросов на перерисовку. Просто пытайтесь сделать это как можно более эффективным, а не просто прямое перерисовку, каждый раз, чтобы перерисовать все на экране. Любые предложения о том, как реализовать/наследовать метод рисования в классе существа, а затем заставить каждого рисовать на глобальный графический объект, прикрепленный к JPanel? –

+0

Взгляните на мою статью, [Спирограф с использованием Java Swing] (http://java-articles.info/articles/?p=614). Каждый объект имеет метод рисования. –

ответ

3

только небольшая часть экрана будет перерисована.

repaint(....).

RepaintManager будет беспокоиться о том, что нужно покрасить, и установит для вас клип объекта Graphics.

+0

Перегрузка перекрасить с помощью отсечения вы имеете в виду? Который в этом случае будет текущей позицией изображения в его целевое положение. Или вы имели в виду, что диспетчер Repaint достаточно умен, чтобы узнать, какие графические объекты нужно обновить/обрезать без этого? –

+0

Объект Graphics не знает, что делает ваш пользовательский код. Если вы хотите изменить конкретное изображение, вам нужно дать оценку этого изображения.Имейте в виду, что если вы обновляете несколько изображений, RepaintManager будет комбинировать запросы в один запрос на рисование компонента, а область отсечения будет самым маленьким прямоугольником, который включает в себя два изображения. – camickr

+0

Это то, что я ищу, только для того, чтобы я рассказывал об этом каждый раз, когда repaint называется частью экрана/окна для обновления и оставления остальных. Объединение запросов перерисовки также прекрасное, если оно не заклинит половину изображения, когда они перекрываются или находятся рядом друг с другом. –

0

Непосредственно из интереса можно сделать объект Graphics привязанным к JPanel в AquaSim global, а затем изнутри каждого объекта Creature использовать этот графический объект для рисования в JPanel?

Хотя я предполагаю, что мне нужно будет выяснить, как реализовать/переопределить метод рисования в классе существ немного, как Гилберт пытается сказать мне.