Как и в моих последних сообщениях, извинения, но гораздо менее длинные. В основном мне интересно, какой оптимальный вариант для оптимизации перерисовки на 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.
}
}
Поэтому любые предложения, какие бы наиболее эффективным способом использовать? В виду, что перекраска будет многократно называться многими объектами/существами, то есть много раз в секунду, поэтому я не хочу, чтобы она перерисовывала каждый на экране каждый запрос на перерисовку.
Свинг полностью способен многократно перерисовывать много объектов на современном компьютере. Как правило, в анимации Swing объекты несут ответственность за рисование. Код чертежа находится в классах моделей, но выполняется как часть представления, поддерживая разделение проблем Model/View/Controller. –
Действительно, я ожидаю, что Менеджер перерисовки объединит многие из запросов на перерисовку. Просто пытайтесь сделать это как можно более эффективным, а не просто прямое перерисовку, каждый раз, чтобы перерисовать все на экране. Любые предложения о том, как реализовать/наследовать метод рисования в классе существа, а затем заставить каждого рисовать на глобальный графический объект, прикрепленный к JPanel? –
Взгляните на мою статью, [Спирограф с использованием Java Swing] (http://java-articles.info/articles/?p=614). Каждый объект имеет метод рисования. –