Java, comment dessiner en constante évolution graphique

Ne l'avez pas fait avant, donc évidemment, je l'ai sucer. Ici 64 pixels autour de la position actuelle de la souris est dessinée peu plus gros sur un formulaire. Problème, c'est que c'est le genre de " ralentir, et je n'ai aucune idée de par où commencer à corriger.

En plus de cela, j'ai fait un thread qui appelle constamment mise à jour des graphiques lorsque c'est fini, et un peu de fps, comme du texte, pour montrer vraiment à quelle vitesse les choses sont tirés.

De l'Image exemple: (l'Image est à partir de la lettre " a " dans Eclipse)

Java, comment dessiner en constante évolution graphique

Exemple de Code :

@SuppressWarnings("serial")
public static class AwtZoom extends Frame {
private BufferedImage image;
private long timeRef = new Date().getTime();
Robot robot = null;
public AwtZoom() {
super("Image zoom");
setLocation(new Point(640, 0));
setSize(400, 400);
setVisible(true);
final Ticker t = new Ticker();
this.image = (BufferedImage) (this.createImage(320, 330));
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
t.done();
dispose();
}
});
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
t.start();
}
private class Ticker extends Thread {
public boolean update = true;
public void done() {
update = false;
}
public void run() {
try {
while (update == true) {
update(getGraphics());
//try {
//Thread.sleep(200);
//} catch (InterruptedException e) {
//e.printStackTrace();
//return;
//}
}
} catch (Exception e) {
update=false;
}
}
}
public void update(Graphics g) {
paint(g);
}
boolean isdone = true;
public void paint(Graphics g) {
if (isdone) {
isdone=false;
int step = 40;
Point p = MouseInfo.getPointerInfo().getLocation();
Graphics2D gc = this.image.createGraphics();
try {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
gc.setColor(robot.getPixelColor(p.x - 4 + x, p.y
- 4 + y));
gc.fillOval(x * step, y * step, step - 3, step - 3);
gc.setColor(Color.GRAY);
gc.drawOval(x * step, y * step, step - 3, step - 3);
}
}
} catch (Exception e) {
e.printStackTrace();
}
gc.dispose();
isdone = true;
iter++;
}
g.drawImage(image, 40, 45, this);
g.setColor(Color.black);
StringBuilder sb = new StringBuilder();
sb.append(iter)
.append(" frames in ")
.append((double) (new Date().getTime() - this.timeRef) / 1000)
.append("s.");
g.drawString(sb.toString(), 50, 375);
}
int iter = 0;
}

Modifications apportées:
* ajout de "gc.dispose();"
* ajout de "isdone", afin de redessiner ne pouvait pas être appelé plus vite, alors il devrait.
* ajout de la ce lien à thrashgod source de réécriture
* ajout de la ce lien à thrashgod source de réécriture 2

pourquoi ne pas seulement repeindre lorsqu'un déplacement de la souris événement se produit?
Pourquoi êtes-vous en invoquant le garbage collector au cours de paint?
Vraiment envie de peindre ce qui est près de la souris, et vous voulez qu'il travail où la souris est (aussi vite qu'il pouvait, même si sur la vidéo). Le problème, je suppose que vous avez trouvé c'est que la peinture événement pourrait également être appelée non pas par thread t. Je pense, c'est pas un problème, mais il fixe avec l'ajout de "isdone" de toute façon.
Quelques indicateurs généraux (1), vous ne devez peindre sur l'Event Dispatch Thread, mais vous avez l'air d'être de la peinture dans le Ticker Fil. (2) Vous ne devriez pas besoin d'un "fait" variable parce qu'un seul thread ne peut pas être en cours d'exécution de deux morceaux de code à la fois. (3) Essayez et séparer ce dans un Modèle (un 8*8 tableau de Couleurs) et la Vue (que vous demandez à repeindre lorsque le modèle est mis à jour). (4) Envisager l'utilisation de repeindre(x, y, w, h), ce qui indique une zone de fenêtrage et donc repeint plus rapide.
J'ai fait quelques profilage - robot.getPixelColor(..) est chien lent sur mon Mac. C'est un bon endroit pour commencer à chercher des améliorations

OriginalL'auteur Margus | 2010-09-18