# klick auf ComboBox ohne ActionListener --> CPU ausgelaste



## little08 (1. Jun 2008)

Moinsen, 
Wir sind gerade dabei ein 2D rocket-game zu erstellen.
Alle Quelldateien findet ihr unter dem unten angegebenen link.

Das Problem ist folgendes:

Wir haben in classMenu durch ComboBoxen 'Einstellungen' geschaffen. Diese ComboBoxen haben keinen ActionListener.
Sobald wir auf eine der Boxen klicken (ohne zu speichern oder das Ergebnis irgendwie zu verwenden) und wieder ein Spiel starten sind die Raketen viel langsamer, alles ruckelt und die CPU-Auslastung ist in die Höhe geschnellt.

Warum? :bahnhof: 

vielen Dank schon im Vorraus für eure Hilfe...

mfg little und aomx 


Quelldateien:
http://aomx.ao.funpic.de/spiel.zip


----------



## little08 (1. Jun 2008)

ergänzung:
wir haben die cpu Auslastung genauer beobachtet. Nach ca. einer Minute hat sich das Problem gelegt und alles läuft wie gewünscht. Wir vermuten logischerweise dass intern irgendwelche Prozesse gestartet werden die den PC quasi lahm legen, haben nur keine Ahnung welche.

Pls helft uns  :?  müssen am Dienstag unser Projekt abgeben :autsch: 

danke

aomx und little


----------



## Siassei (1. Jun 2008)

Servus,

ich verstehe dein Problem nicht so ganz. Hast du eventuell ein wenig Code zum vorzeigen?

[edit] Hab da was übersehen, sorry   [/edit]


----------



## Guest (1. Jun 2008)

der gesamte code ist unter dem oben angegebenen Link zu erreichen.

Ausschnitt:


```
JComboBox combo2 = new JComboBox();
	JComboBox combo3 = new JComboBox();
	JComboBox combo4 = new JComboBox();

public void startSettings() {
starteSettings = true;
hideMainMenu();
if (!itemsAdded) {

			for (int i = 0; i < shoot1.length; i++)
				combo2.addItem(shoot1[i]);

			for (int i = 0; i < shoot2.length; i++)
				combo3.addItem(shoot2[i]);

			for (int i = 0; i < shootSpeed.length; i++)
				combo4.addItem(shootSpeed[i]);

			itemsAdded = true;

		}

[...] // labels

combo2.setBounds(500, 225, 100, 20);
		label.add(combo2);

[...] // labels

combo3.setBounds(500, 400, 100, 20);
		label.add(combo3);

[...] // labels

combo4.setBounds(500, 450, 100, 20);
		label.add(combo4);

		combo4.setSelectedIndex(2);

		combo2.setVisible(true);
		combo3.setVisible(true);
		combo4.setVisible(true);
```

Bei einem klick auf eine der Boxen  schnellt die CPU-Auslastung nach oben. Könnt ihr vllt. auch besser bei euch selbst ausprobieren? alles nötige dazu findet ihr in der .zip unter dem link oben.

mfg aomx und little


----------



## little08 (1. Jun 2008)

edit:

wir haben gerade festgestellt dass nach längerem (ca. 1 min.) spielen das gleiche Problem auftritt. Vielleicht weil das classShoots[] array zu groß wird?

mfg aomx und little


----------



## little08 (1. Jun 2008)

noch ein update:

wie haben festgestellt dass es ohne grafiken nicht ganz so krass ist, aber trotzdem der fall. Das Problem ist mehr das Menü und die Einstellungen als das Array.
wie haben das array mit 2000 shoots vollgepunpt und die auslastung war bei 40% max.  dann haben wir esc gedrückt um ins menü zu kommen und die auslastung schnellt auf 95% hoch.
Das gleiche als wir auf eine ComboBox geklickt haben. direkt auf 90 bis 95% CPU auslastung.

liegt das daran dass java gammlig ist oder daran dass unser Programm gammlig ist?^^

mfg... aomx und little...


----------



## Siassei (1. Jun 2008)

> liegt das daran dass java gammlig ist oder daran dass unser Programm gammlig ist?^^


Sorry, aber es liegt wohl eher an eurem Programm  :wink: Ist wohl euer erstes Programm in Java 

Eine CPU Ausslastung von 100% ist erstmal nicht schlecht -> die Aufgabe wird so schnell wie möglich erledigt. Zeit ist Geld. Ich gehe mal davon aus, dass ihr noch nicht sehr viel von Thread's und AWT bzw. Swing erklärt bekommen habt. Ich würde euch empfehlen eine IDE wie z.B. Netbeans (mit einem sehr guten Profiler) zu benutzen und euren Code ein wenig zu optimieren.

Tips:
- Warum habt ihr einen Timer der alle 10ms Benutzereingaben überprüft? (Listener verwenden)
- Wieso wird ein repaint() im besagten Timer "macheTask" ausgeführt?
- so wenig Code/Arbeit wie möglich in den ActionListener und Zeichenmethoden platzieren?
- Code ist sehr unübersichtlich und enthält fast keine Kommentare
- Ablaufmanagement?
z.B.
1. init. der Objekte
2. resultierende Veränderungen aus Benutzereingaben, Framerate, ... an den Objekten berechnen
3. Veränderte Objekte neu zeichnen
4. und wieder zwei Stufen zurück


----------



## little08 (1. Jun 2008)

okay...

wie würdest du das mit repaint() dann machen?

und kann das daran liegen dass 100% cpu auslastung kommt weil man escape drückt oder weil man auf eine combobox klickt?
entsprechend laggen die ufos dann auch und sind viel langsamer...

meinst du das liegt daran oder hat das dann andere ursachen?

mfg


----------



## little08 (1. Jun 2008)

und wie stellst du dir das mit dem (nicht-) timer vor?

was für einen listener soll man verwenden um 


```
if (myMenu.isGameStarted())
```

abzufragen?

die tastatureingaben werden ja per listener abgefragt...

mfg... little
	
	
	
	





```

```


----------



## little08 (1. Jun 2008)

ach.. und was meinst du mit ablaufmanagement?^^

mfg...


----------



## Gast (2. Jun 2008)

Siassei hat gesagt.:
			
		

> > - so wenig Code/Arbeit wie möglich in den ActionListener ... platzieren?
> 
> 
> 
> Warum? Im repaint klar, so wenig wie geht, aber warum in den ActionListenern?


----------



## Siassei (2. Jun 2008)

> Warum? Im repaint klar, so wenig wie geht, aber warum in den ActionListenern?


Wenn mich nicht alles täuscht besitzt AWT für die Abarbeitung der Events nur einen Thread. Hoffentlich   Bekommt dieser nun ein einem Event eine größere Aufgabe zu erledigen, hängt deine komplette GUI fest.


----------



## Aomx (2. Jun 2008)

Hi Siassei,
so wie ich deine Posts interpretiere, vermutest du, dass die hohe CPU-Auslastung und die daraus folgende Verlangsamung ihre Ursache in dem Timer hat, welcher alle 0.01 Sekunden den ActionListener macheTask() aufruft. In dem ActionListener wird, je nachdem welche Spieloption man im Menü gewählt hat, entweder die aktuellen Positionen der Spieler oder der Schüsse (bzw der classShoot) berechnet und abschließend per repaint() ein neues Bild berechnet. Somit ist laut meiner Logik dieser auf seine wichtigsten Programmteile beschränkt - neue Werte berechnen und neues Bild zeichnen lassen.

Was würdest Du konkret löschen? Würde dann nicht das komplette Spieldesign zerfallen? Die Positionen müssen ja vor jedem Neuzeichnen berechnet werden, da ansonsten ja alles stehen bleibt...

Mfg Aomx


----------



## Siassei (2. Jun 2008)

Servus Aomx,

sorry, dass ich erst jetzt antworte. Aber das Wetter war so schön  
Konkret? Keine Ahnung. Das Programm ist winzig und ich habs erhlich gesagt noch nicht so ganz durchgesehen. Aber eigentlich müsste es ohne Probleme laufen. Wie auf meiner Workstation (schon 4 Jahre alt).

Was mir persönlich daran nicht gefällt und deutliche Übersichtlichkeit, Wartbarkeit und Erweiterbarkeit bringen würde
- Trennung der Visuallisierungsschicht von der Programmlogik  :!: 
 -> es wird mind. 1 Thread für das Zeichnen und einer für den Kinematischenteil benötigt

Jedoch sei eins erwähnt: Klasse Menu

```
public void paintIntro(Graphics g) {
        ro = 0;
        ge = 0;
        b = 0;
        /*
         * if (Math.abs(r.nextInt()%25) == 1) { ro = Math.abs(r.nextInt()%255);
         * ge =Math.abs(r.nextInt()%255); b = Math.abs(r.nextInt()%255); }
         */
        g.setColor(new Color(ro, ge, b));

        g.fillRect(0, 0, d.width, d.height);
        if (introZahler <= 5) {
        }
        if (introZahler >= 35) {
            g.setFont(new Font("Dialog", 1, 25));
            g.setColor(Color.RED);
            g.drawString("The", d.width / 2, 150);
        }
        if (introZahler >= 78) {
            g.setFont(new Font("Dialog", 1, 45));
            g.setColor(Color.RED);
            g.drawString("Game", d.width / 2 - 35, 193);
        }
        if (introZahler >= 110) {
            g.setFont(new Font("Dialog", 1, 55));
            g.setColor(Color.ORANGE);
            g.drawString("Will", d.width / 2 - 25, 250);
        }
```
Und das in einer Paint-Mehtode  ???:L Bei jedem Paint werden etliche NEUE String-Objekte erzeugt, gezeichnet und wieder verworfen.


----------

