Hallo Brüder des Glaubens 
Ich hab vor ein paar Wochen mal angefangen ein kleines Spiel in Swing zu realisieren. läuft auch schon ganz gut finde ich.
Um nun nach Performance-Löchern zu suchen hab ich hyades und das Java-Bordwerkzeug hrunXprof() (oder so ähnlich) benutzt. Dabei stellte sich heraus das die PaintComponent die zum Zeitpunkt des Speicherlesens durch beide Profiler meistbenutzte war. Wundert mich auf der einen Seite nicht, da sie direkt im Konstruktor mit nem Tread versehen wird der alle 10ms nen repaint() aufruft. Trotzdem wär ich echt happy wenn ihr auch mal draufgucken könnt.
lib= BackBoneKlasse, ist überall in meinem Programm bekannt, damit ich manche Daten programmweit habe.
VisibleMapableObject = Jedes in meiner Karte sichtbare Object. kann xpos, ypos, Image (und deren Methoden).
Der im Konstruktor gestartete Thread ruft alle 10 ms repaint() auf, mein Bild wird also (wenn ich die Zeit für den Durchlauf der PaintComponent vernachlässige) 100mal/s neu aufgebaut.
nun bin ich mir aber nicht sicher ob ich die Auswertung in der PaintComponent machen soll oder besser auslagern.
Momentan frisst die Anwendung unter Last ca 40% CPU, in Ruhe ca 2%.
Vielleicht sieht ja von euch jemand ob ich was verbessern kann.
Viel Spass
Ich hab vor ein paar Wochen mal angefangen ein kleines Spiel in Swing zu realisieren. läuft auch schon ganz gut finde ich.
Um nun nach Performance-Löchern zu suchen hab ich hyades und das Java-Bordwerkzeug hrunXprof() (oder so ähnlich) benutzt. Dabei stellte sich heraus das die PaintComponent die zum Zeitpunkt des Speicherlesens durch beide Profiler meistbenutzte war. Wundert mich auf der einen Seite nicht, da sie direkt im Konstruktor mit nem Tread versehen wird der alle 10ms nen repaint() aufruft. Trotzdem wär ich echt happy wenn ihr auch mal draufgucken könnt.
Code:
public class Map extends JPanel {
...
/**
* Konstruktor
*
* wichtig: der Repaint-Thread wird sofort gestartet
* @param lib
*/
public ScrollingMap(Libration lib) {
....
if(t2!=null)t2.interrupt();
t2 = new Thread(rep);
t2.start();
}
/**
*
* Zeichnen
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
//Hintergrundverschiebung
//-----------------------
if(lib.getImc()!=null){
g2d.drawImage(lib.getImc().getImage("blue.jpg"),
((lib.getPlayer().getXPos()%128)+128)*-1,
((lib.getPlayer().getYPos()%128)+128)*-1,
null);}
//Sichtbare grenzen in der welt bestimmen
//---------------------------------------
int xmin=lib.getPlayer().getXPos()-middlex;
int xmax=lib.getPlayer().getXPos()+middlex;
int ymin=lib.getPlayer().getYPos()-middley;
int ymax=lib.getPlayer().getYPos()+middley;
//alle in world vorhandenen elemente auf sichtbarkeit prüfen
//----------------------------------------------------------
for (int i=0;i<lib.getWorld().size();i++){
VisibleMapableObject vmo=(VisibleMapableObject)lib.getWorld().elementAt(i);
//auf alles ausser den Spieler reagieren
//---------------------
if (vmo!=lib.getPlayer()) {
if(vmo.getXPos()>=xmin-middlex &&
vmo.getXPos()<=xmax+middlex &&
vmo.getYPos()>=ymin-middley &&
vmo.getYPos()<=ymax+middley ){
g2d.drawImage(vmo.getImage(),
((vmo.getXPos()-xmin)-(vmo.getImage().getWidth()/2)),
((vmo.getYPos()-ymin)-(vmo.getImage().getHeight()/2)),
null);
}
}
}
//Zielflagge bei gesetztem kurs
//-----------------------------
if(lib.getPlayer().getXPos()!=lib.getPlayer().getKursx() ||
lib.getPlayer().getYPos()!=lib.getPlayer().getKursy() ){
g2d.drawImage( lib.getImc().getImage("flags/flag.gif"),
lib.getPlayer().getKursx()-lib.getPlayer().getXPos() +middlex ,
lib.getPlayer().getKursy()-lib.getPlayer().getYPos() +middley-lib.getImc().getImage("flags/flag.gif").getHeight() ,
null);
}
//Spieler zeichen
//Muss hier geschehen damit der Spieler
//NPC'S und andre PC'S überzeichnet
//---------------
g2d.drawImage(lib.getPlayer().getImage(),
(middlex-(lib.getPlayer().getImage().getWidth()/2)),
(middley-(lib.getPlayer().getImage().getHeight()/2)),
null);
}
}
lib= BackBoneKlasse, ist überall in meinem Programm bekannt, damit ich manche Daten programmweit habe.
VisibleMapableObject = Jedes in meiner Karte sichtbare Object. kann xpos, ypos, Image (und deren Methoden).
Der im Konstruktor gestartete Thread ruft alle 10 ms repaint() auf, mein Bild wird also (wenn ich die Zeit für den Durchlauf der PaintComponent vernachlässige) 100mal/s neu aufgebaut.
nun bin ich mir aber nicht sicher ob ich die Auswertung in der PaintComponent machen soll oder besser auslagern.
Momentan frisst die Anwendung unter Last ca 40% CPU, in Ruhe ca 2%.
Vielleicht sieht ja von euch jemand ob ich was verbessern kann.
Viel Spass