# performance fragen zu AWT, Swing



## Guest (3. Feb 2008)

hallo,

ich habe ein snake-spielchen gemacht, was aber irgendwie sich komisch verhält.

es "ruckelt", aber nich wirklich, bzw. nich immer. es ist schwer zu beschreiben, aber man hat ja immer so 
ein gefühl, wenn etwas nich ganz flüssig läuft. man kann nie genau sagen, wann es jetzt geruckelt hat usw,
dafür läuft das ganze auch zu schnell.

aber es ist eben so ein ruckel-feeling drin beim zocken. man merkt einfach, dass da etwas nicht ganz passt.

ich hab keine ahnung woran das liegen könnte.
ich würde ehrlich gesagt gerne jemanden finden, der mal kurz drüber fliegt über mein programm.

es sind so 4 oder 5 klassen, alle ca. 100 zeilen code. wichtig sind ja nur so array-durchläufe und paint-methoden für swing und so.
am besten ariol oder so, oder jemand anders, der aus meinem anderen thread schon etwas ahnung hat, was ich da mache..

bringt ja jetzt nix, ewig viel code zu posten. würde halt jmd. ne pn schreiben, bzw. alles hochladen rapdishare oder so und ihm nen link geben.

einfach mal so grobes code-überfliegen, was da schlecht gemacht ist, und evtl. zu solchen performance probs führen kann. am besten ihr startet das game auch schnell und zockt ein wenig, um euch selbst n bild von zu machen.
kann man halt leider nicht in worte fassen, und ich gleich 2 mal nicht, weil ich die geschwindigkeit von java mit swing udn so nicht abschätzen kann.

hm, ja. also wenn da jemand etwas lust zu hat auf so ne grobe analyse, wäre ich sehr sehr erfreut darüber.

denn ich weiss, dass man jedes programm sch*** und gut coden kann. bei mir isses wohl eher ersteres, und scheinbar so sehr, dass so ein peinliches mini game ruckelt  ???:L


----------



## JPKI (3. Feb 2008)

Ohne es spielen zu müssen: Versuch mal DoubleBuffering. Dabei erstellst du ein BufferedImage, welches in einer in einem Extra-Thread laufenden Methode bemalt wird. In der paint(-Component)-Methode zeichnest du nur dieses Image, sonst nichts.


----------



## Wildcard (3. Feb 2008)

Swing verwendet bereits eine Buffer Strategy. Davon abgesehen löst ein BufferedImage keine Performanceprobleme, sondern verhindert Artefakte beim Bildwechsel.


----------



## JPKI (3. Feb 2008)

Das isses doch, was ihn stört, oder? Außerdem hat er ja nicht gesagt, ob er AWT oder Swing benutzt.


----------



## Wildcard (3. Feb 2008)

Buffering Probleme äussern sich in Flackern, nicht in Ruckeln.


----------



## hdi (3. Feb 2008)

hallo, ich habe jetzt mal die GEschwindigkeit runtergeschraubt, um mal richtig analysieren zu können,
was da dieses ruckel-gefühl verursacht.

und ich bin mir jetzt ziemlich sicher, dass es nix mit swing zu tun hat, sondern mit ein oder zwei implementierungen von methoden. der wurm "stoppt" immer einen cycle, aber nur direkt vor einer frucht, bevor er sie aufisst.
da hab ich wohl irgendwo n logischen fehler drin.

aber das is nich das einzige. auch an anderen stellen kommt die bewegung nicht flüssig vor.
mit artefakten hat das ja nix zu tun, also das ist hier wohl kein puffer-problem.

ich schätze jetzt einfach, dass ich da noch einige fehler drin hab. sie sind nur schwer zu finden, weil sie ja schon so schwer auszuformulieren sind. naja, das überfliegen des codes ist noch immer n angeobt


----------



## hdi (3. Feb 2008)

okay, also ich brauche wohl doch eure hilfe, bzw. euer hintergrundwissen.

das spiel ruckelt immer wieder kurz, ich erkenne keine regelmässigkeit.
das kann ja eigentlich nur heissen, dass da irgendwas nicht schnell genug nachkommt, denn
wenn es z.B. daran liegen würde, wie ich den wurm bewege und zeichne, würde es ja immer so sein.

das spiel läuft immer so 3-5 sekunden flüssig, und dann kommt n kurzer hänger rein..
das ist auch recht frustrierend bei so einem spiel wie snake, wo man dann durchaus mal ausm bildschirm läuft, 
weil es geruckelt hat.

aber was kann das sein ? welche arten von java ausführungen führen denn zu solch unterschiedlichen geschwindigkeiten.
mein spiel besteht doch lediglich aus paar array-durchläufen und n paar repaint-aufrufen.
mal gehts, dann ruckelts 

erklärt sich denn keiner bereit, das spiel zumindest mal 30 sekunden zu spielen?
nur, damit ihr wisst was ich meine... ihr könnt denke ich da auch gleich abschätzen, woran so etwas liegt,
man kann es halt eben nicht gut beschreiben 

also falls es jemand kurz anzocken will:

http://rapidshare.com/files/88935286/yas2.jar.html

ausführen mit


> java -cp yas2.jar:. Snake



mfg


----------



## Wildcard (3. Feb 2008)

hdi hat gesagt.:
			
		

> erklärt sich denn keiner bereit, das spiel zumindest mal 30 sekunden zu spielen?
> nur, damit ihr wisst was ich meine... ihr könnt denke ich da auch gleich abschätzen, woran so etwas liegt,


Nein, zu sehen das es ruckelt genügt definitiv nicht für eine Diagnose.


----------



## JPKI (4. Feb 2008)

Also ich kann da beim besten Willen keinen Ruckler erkennen. Das Spiel läuft wirklich flüssig  ???:L .


----------



## Guest (4. Feb 2008)

neee  :shock: 
wie lange hast du gespielt? in der regel merkt man das nach spätestens 15 bis 20 sekunden.

das läuft nich flüssig, ab und zu hat es hänger, und die merkt man wirklich ziemlich intensiv.
zumindest bei mir  ???:L 

und es regt mich so auf, weil ich nicht weiss wieso.

okay, ich bin anfänger in sachen programmieren, und man kann es sicherlich ressourcen-sparender programmieren, aber ein pc heutzutage dürfte doch mit solchen dinge NULL probelme haben. oder nicht?

is ja nich so, dass ich überkrasse 3d-effekt benutze 
es nervt mich extrem, dass so ein simples spiel so komisch läuft, weil es vorallem echt den spielspass drückt....  :bloed:


----------



## Guest (4. Feb 2008)

> okay, ich bin anfänger in sachen programmieren, und man kann es sicherlich ressourcen-sparender programmieren, aber ein pc heutzutage dürfte doch mit solchen dinge NULL probelme haben. oder nicht?



Dürfte er. Aber durch geschickte Programmierung legt man ihn schnell lahm. Da genügen in der Regel wenige Zeilen Code .

Bei mir läufts aber auch ohne Ruckler ...


----------



## HeRaider (4. Feb 2008)

Hast du vielleicht schon mal probiert deiner VM mehr Arbeitsspeicher zuzuweisen?


----------



## JPKI (4. Feb 2008)

was für eine VM-Version benutzt du denn?


----------



## Guest (4. Feb 2008)

> java version "1.6.0_03"
> Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
> Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)



ich habe 1GB ram, kA wieviel die VM davon zugteilt bekommt, aber ich hab nen standart rechner für die heutigen verhältnisse, da dürfte nix faxen machen.

ich glaube noch immer nicht, dass es bei euch flüssig läuft. ich habs nochmal gespielt, wahrscheinlich fällt es mir halt krasser auf weil ich schon so darauf achte.. es ist wie gesagt unregelmässig. vllt seht ihr es einfach nicht.

aber ich habe nun eine idee: ich würde gerne in meine hautpschleife vor jedem aufruf der move-funktion von wurm einen zeitmesser anbringen, und mir auf der console die verstrichene zeit anzeigen lassen.
nur kucken, ob es wirklich immer 100ms sind, was ich eben nicht glaube.

wie heisst die java-klasse für sowas? gibt doch sicherlich ne funktion, die die systemzeit als long zurückgibt oder so?

mfg


----------



## JPKI (4. Feb 2008)

Anonymous hat gesagt.:
			
		

> ich glaube noch immer nicht, dass es bei euch flüssig läuft.


Frechheit! Als ehemaliger Profizogger weiss ich ganz genau wann was ruckelt und wann nicht. Und dein Spiel ruckelt definitiv *nicht*.


			
				Anonymous hat gesagt.:
			
		

> gibt doch sicherlich ne funktion, die die systemzeit als long zurückgibt oder so?


Ja. java.lang.System#currentTimeMillis() oder java.lang.System#nanoTime(), wobei nanoTime() genauer ist.

P.S.: Zeig doch mal den Schleifen-Code.


----------

