Performance

bob_sheknowdas

Aktives Mitglied
Hi,
ich habe ein Spiel zusammengeschrieben, was so weit fast fertig ist (paar Optimierungen fehlen noch, aber an sich ist es spielbar).
Bei mir lief das auch immer ganz gut, aber ich habs mal einem Freund geschickt zum testen und er meint bei ihm ruckelt das wie bekloppt.

Ich hab jetzt als Java-Anfänger nicht so die Ahnung von Code- und Performanceoptimierung, deswegen woltl ich hier mal nachfragen. Irgendwie sowas wie die 10 Grundregeln von Performantem Javacode wären gut.

Ich hab schon mal im Netzt nen bischen geschaut und folgendes gefunden.

1. Variablen bei denen das möglich/sinnvoll ist immer final setzen.
2. If-Abfragen so schachteln, dass der wahrscheinlichste Fall möglichst früh eintritt.
3. Anstatt
Java:
a.getb().getc().mach1();
a.getb().getc().mach2();
immer
Java:
C c = a.getb().getc();
c.mach1();
c.mach2();

Das hab ich so weit umgesetzt, hat aber bis jetzt noch nicht den gewünschten Effekt gebracht...
Fallen euch noch mehr solche Grundsätze ein?
 
S

SlaterB

Gast
die bisher genannten Tipps, also 3. könnten schon was bringen, falls zufällig getc(); erst aufwendig irgendwas berechnet,
dann wären 50% gespart,
dabei gehts aber normalerweise bei diesem Tipp nicht, der ist auch für einfache getter angedacht

allein mit solcher Kosmetik kannst du den Windows-Quellcode von 2 GB auf 300 MB zusammenstampfen,
es müsste aber dennoch nicht unbedingt schneller laufen

wirklich wichtig für Performance sind inhaltliche Optimierungen, z.B. angezeigte Bilder nicht bei jedem repaint() von der Festplatte neu laden,
sondern am Anfang im Konstruktor als Instanzattribut ablegen, das fällt nicht unter Standardregeln, oder?

poste Code wenn was langsam läuft und erkläre gewisse Abläufe,
untersuche selber, ob mit simplen System.out.println oder Profilern, welche Codeabschnitte wie lange besucht werden
 
F

Firephoenix

Gast
Grundsätzlich zur Performance:
-Gute Algorythmen verwenden
-nur das berechnen was man braucht
-kein "polling" betreiben
-kritische stellen über profiling herausfiltern (google)
-überlegen warum an diesen stellen die meiste rechenzeit verbracht wird und ob man dort optimieren kann.
-Daten auf Vorrat halten (Bilder nicht bei jedem Zeichnen neu von der Platte laden, bei einem Netzwerkspiel nich pro update das gesamte level über das netzwerk an alle Spieler schicken...)
-...

Sicherlich nicht das leichteste Thema, aber ich denke intelligenter Code geht immer über diese Minitricks wie final-Variablen, wenn die Operation in O(n^2) läuft kann man lange tunen, man kommt nie an den Effekt als würde man sie durch eine gleichwertige Operation ersetzen die in O(n* log n) läuft :)

Gruß
 

bob_sheknowdas

Aktives Mitglied
Grundsätzlich zur Performance:
-Gute Algorythmen verwenden
-nur das berechnen was man braucht
-kein "polling" betreiben
-kritische stellen über profiling herausfiltern (google)
-überlegen warum an diesen stellen die meiste rechenzeit verbracht wird und ob man dort optimieren kann.
-Daten auf Vorrat halten (Bilder nicht bei jedem Zeichnen neu von der Platte laden, bei einem Netzwerkspiel nich pro update das gesamte level über das netzwerk an alle Spieler schicken...)
-...

Sicherlich nicht das leichteste Thema, aber ich denke intelligenter Code geht immer über diese Minitricks wie final-Variablen, wenn die Operation in O(n^2) läuft kann man lange tunen, man kommt nie an den Effekt als würde man sie durch eine gleichwertige Operation ersetzen die in O(n* log n) läuft :)

Gruß


bedeutet "polling" auch in meinem threat ständig über if() zu prüfen ob mein Leben > 0 ist?
wenn ja, wie umgeh ich solche Abfragen?
 
S

SlaterB

Gast
denkbar ist, entsprechende Aktionen nur dann zu veranlassen, wenn das Leben geändert wird, gar fällt,
was ja wohl nicht ganz so häufig der Fall sein wird,

aber ein if auf einfache Variablen, auch regelmäßig, mag vielleicht technisch als Polling zählen,
ist aber nur dann kritisch wenn es wirklich Ressourcen verbraucht, etwa weil jedes if einen Netzwerkzugriff zum Server verursacht

problematisch kann daran sein, eine Schleife ohne Pause zu verwenden, welche Millionen Mal pro Sekunde ausgeführt wird,
einen CPU-Kert auf 100% Auslastung setzt,
20ms Warten reduzieren die Durchläufe dagegen auf 50 pro Sekunde
 

bob_sheknowdas

Aktives Mitglied
hmm, also bis jetzt habt ihr nix genannt wo ich mir einer Schuldbewusst wäre...
Es ist für mich auch schwierig zu sagen an welcher Stelle genau es hackt (bei mir läuft ja alles flüssig).
Mein Kumpel meinte nur das Spiel stockt und ich nehme an er meint damit den gesammten Spielablauf...

Was ich sagen kann ist, dass das Programm beim starten etwas länger braucht, aber das liegt daran, dass Bild- und Musikdateien geladen werden müssen...
Ich hatte schon überlegt ob vllt zu große Bilder Ursache des problems sein könnten, aber der PC meines Kumpels spielt 2 Jahre alte Games ohne Probleme (und die sollten doch weit größere Texturen verwenden)...

Ansonsten kann ich euch hier nur mal einen Downloadlink für mein Projekt abieten. Es ist mit java3D geschrieben (die Bibliotheken müsstet ihr euch also ziehen wenn ihr testen wollt).
Die main-Methode befindet sich in der Klasse "Spiel". Nach drücken des Start-Buttons gehts los. Beschleunigen mit Pfeiltasten, Steuerung mit WASD, Waffe wechseln mit Q oder E (erst nachdem Updates [kleine gelbe Kugeln] eingesammelt wurden), Ballern mit Leertaste. Ziel ist das grüne Schiff mit möglichst wenig verbrauchter Munition zu zerhaun...
https://dl-web.dropbox.com/get/SpaceShooter.zip?w=d4a96866
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Generell kann man aber sagen, wenn dein Programm nicht flüssig läuft liegt es nicht an den 3 Punkten die do oben beschrieben hast... da hast du schon was anderes falsch gemacht...
 

herdi

Mitglied
bedeutet "polling" auch in meinem threat ständig über if() zu prüfen ob mein Leben > 0 ist?
wenn ja, wie umgeh ich solche Abfragen?

Da könnte doch die Theorie des "observer pattern" helfen.
Grobe Architektur könnte da sein:

Du hast einen Handler, der die Ereignisse behandelt und entsprechend an das Subjekt weiter gibt.
Dieses gibt die Information(en) mittels "push" weiter an die jeweiligen "Observer". Diese updaten dann ihren Status. Bspw.: die Health Points, Munition, aktuellen Waffentyp etc.

So vermeidest du u.a. das "polling". Keine zyklischen Abfragen über Änderungen von Objekteigenschaften.

An sich ist es nur ein Threat.

Ich habe mir dein Spiel nicht angeschaut. Der Name "Spaceshooter" lässt mich aber erahnen, dass Objekte/ Ereignisse parallel erzeugt werden. Hier mit Threads zu arbeiten wäre sinnvoll, da wie oben beschrieben Objekte/ Ereignisse sequentiell sondern parallel erzeugt werden. Bspw.: Gegner UND Asteroiden.
Ein weiteres Beispiel: ich arbeite neben meinem Studium als Java Entwickler in einem BI Unternehmen. Dort entwickle ich u.a. Software, die große Datenmengen verwerten/auswerten soll. Natürlich soll der Endbenutzer eine GUI vor sich haben. Hier wird die Datenauswertung und die GUI jeweils in separaten Threads ausgeführt, da der Algorithmus der Auswertung der Daten parallel starten kann, während sich die GUI aufbaut bzw. umgekehrt.
 

Titanpharao

Bekanntes Mitglied
Hat dein Kumpel vielleicht 64bit Java und du 32bit?

Bei meinem Spiel hat das bei einem auch mal signifikate Unterschiede gemacht, wobei hier das 64bit langsamer war ... o_O
 

homer65

Top Contributor
Bei Performance Problemen gilt generell:
Wenn man die Ursache nicht kennt, wird man das Problem auch nicht beheben.
Einfach irgentwelche Dinge tun, weil sie angeblich gut für die Performance sind, ist stochern im Nebel und führt zu nichts.
Also: Erstmal die Ursache suchen.
Bei Java sind da "Profiler" hilfreich.

Einzige Ausnahme: Schnellere Hardware tuts oft auch.
Da spart man sich den Aufwand der Ursachenforschung, ist die Frage was weniger Aufwand ist.
 

Marco13

Top Contributor
Ja, das läuft hier flott, aber auf einem alten Rechner sieht es vermutlich anders aus. TPTP sagt, dass (wenn man Space oft mal gedrückt hält) playLaser ziemlich teuer ist. Vermutlich solltest du mal die Feuerrate begrenzen. Ansonsten sieht der Rechner nämlich ziemlich gelangweilt aus.

Das Spiel an sich ... könnte ja ganz lustig sein, aber ersten sind die Pfeiltasten für hoch und runter gerade vertauscht :autsch: und zweitens dreht sich das Schiff so schnell, dass man praktisch nicht zielen kann. Eine Maussteuerung wäre nicht schlecht. (Und mehr Gegner und so, aber das hat damit ja nichts zu tun)
 

Anhänge

  • Profiling01.png
    Profiling01.png
    86,3 KB · Aufrufe: 101

bob_sheknowdas

Aktives Mitglied
Hmm, naja danke auf jeden Fall für die vielen Antworten - ich werd mal schaun was sich damit anfangen lässt...


Das Spiel an sich ... könnte ja ganz lustig sein, aber ersten sind die Pfeiltasten für hoch und runter gerade vertauscht :autsch: und zweitens dreht sich das Schiff so schnell, dass man praktisch nicht zielen kann. Eine Maussteuerung wäre nicht schlecht. (Und mehr Gegner und so, aber das hat damit ja nichts zu tun)

Die Pfeiltasten sind nicht vertauscht. Es ist wie bei einem richtigen Flugzeug: drückst du den Steuerknüppel nach vorne senkt das Flugzeug die Spitze, ziehst du ihn nach hinten steigt es.

Was das schnelle Lenken angeht: ich habe versucht einen Kompromiss zu finden zwischen guer Zielbarkeit und einem hohen Spieltempo. Wenn ich das Lenken verlangsamme nehm ich denk ich recht viel Geschiwindigkeit aus dem Spiel. Aber wie gesagt, ich bin mit der Feinjustierung noch nicht fertig...

Mehr Gegner wären wieder mehr Objekte, die "intelligent" bewegt werden müssten. Das mach tdas Game ja noch langsammer ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K VideoPlayer: Xuggler seekkeyframe extrem schlechte Performance.. Spiele- und Multimedia-Programmierung 3
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
turing OpenGL / Jogle Code Reveiw zur Performance Verbesserung Spiele- und Multimedia-Programmierung 1
F Massive FPS-Schwankungen, schlechte Performance Spiele- und Multimedia-Programmierung 3
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
K Android: OpenGL render performance Tipps ? Spiele- und Multimedia-Programmierung 4
Grejak Performance Spiele- und Multimedia-Programmierung 5
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
M Performance von BufferedImages Spiele- und Multimedia-Programmierung 15
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
A jogl 2d performance Spiele- und Multimedia-Programmierung 20
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
S Graphics2D Oval vs. Rect -Performance Spiele- und Multimedia-Programmierung 17
Taschenschieber Schachbrett mit SVG/Batik: Performance? Spiele- und Multimedia-Programmierung 3
Tapsi Anfänger braucht einen Rat ^^ --> Performance Spiele- und Multimedia-Programmierung 7
T performance Spiele- und Multimedia-Programmierung 10
egrath Vista OpenGL Performance Problem? Spiele- und Multimedia-Programmierung 3
I RPG-Spiel und Performance Spiele- und Multimedia-Programmierung 33
N Performance Problem bei mit Graphics Spiele- und Multimedia-Programmierung 6
M Spiel Performance erhöhen Spiele- und Multimedia-Programmierung 24
M Performance Spiele- und Multimedia-Programmierung 5
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19
M Space PingPong Game --> Performance ok? Spiele- und Multimedia-Programmierung 44
J Performance Spiele- und Multimedia-Programmierung 6
P Java3D Performance und Abstürze Spiele- und Multimedia-Programmierung 3
K Performance von J3D Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen


Oben