Jake2

uakeIIuakeII meetsmeets JavaJava

Dipl.-Ing. Carsten Weiße Dipl.-Inf. René Stöckel

http://www.bytonic.de

Jake2 - || meets Java 135. Unix Stammtisch TU Chemnitz 1 uakeII meets Java

135. Unix Stammtisch an der TU-Chemnitz

l Das Sourceforge-Projekt Jake2

l Wie langsam ist Java wirklich?

l (3D-Game-Engine Interna)

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 2 Wer sind bytonic software? g Rene Stöckel

l Dipl.-Inf. (TU-Chemnitz)

l Systemhaus Chemnitz GmbH g Carsten Weiße

l Dipl.-Ing. für Informationstecknik (BA-Glauchau)

l Bildungsportal Sachsen GmbH g Holger Zickner

l Dipl.-Inf. (Uni Halle)

l Mitarbeiter am Lehrstuhl für Maschinenbau der TU-Chemnitz

l VR-Labor

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 3 Jake2 – Motivation / Ziele g id-software stellt seine Q2-Engine unter die GPL. g Der Quake II ist somit seit Ende 2001 verfügbar. g Analysieren der Quake II Engine g Suche nach Inspiration „back to the roots“ g Schnaps-Idee (Spass an der Informatik) g Benchmark-Wette (Slideshow oder Spiel?) g Wie organisiert man die Zusammenarbeit (Teamwork, verteiltes Entwickeln mit CVS)?

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 4 Der erste Kontakt g Quake2 Code Pfad (170 000 Zeilen Code)

g Erster Eindruck: sehr strukturiert

g Wie bekommt man dieses Monster in den Griff?

l nicht mit dem vi

l Einfache Skripte (Portierung von #define-Konstanten, Monster- Automaten)

l Code templates (Eingabehilfen in Eclipse)

l Suchen-/Ersetzen Tricks

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 5 Jake2 – Vorüberlegungen

Java-API Tests

l JOGL (Java OpenGL binding) für den Renderer

l Demos unter https://jogl.dev.java.net

l Sound wurde erstmal nicht betrachtet

l später JOAL (Java OpenAL binding) für den 3D-Sound

l als alternative auch LWJGL (game library möglich)

Festlegungen und Portierungstrategien

l souce code Verwaltung per CVS

l Never touch a running system!

l Aufteilung in 3 Arbeitspakete • Nach Interessengebieten • Nach Schnittstellen

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 6 Werkzeuge

g Doxygen (HTML-Doku des Quake2 source codes) g Eclipse (Java IDE) g CVS (zur Verwaltung des source codes) g ANT (XML-basiertes build tool; ähnlich make) g einfache Skripte (erledigen stupider Arbeiten) g Gehirnschmalz g regelmäßige Treffen und Absprachen g konstruktiver Streit

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 7 Jake2 und Eclipse

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 8 Jake2 – Arbeitspakete

cvs.sourceforge.net/cvsroot/jake2

Entwickler: rst cwei hoz Packages Screen / Menu / Effekt-Darstellung Game-Engine (Monsters, Doors, Players, Items) Installer / Webstart FileSystem, Network 3D-Darstellung Server / Physik / World / Entities 3D-Surround-Sound Keyboard / Maus Math3D

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 9 Erste Ergbnisse (Tests) g die Klasse TestRenderer

l Partikelsystem

l Playermodell

l Sprites g Beispiel: Partikelanimation

l simple Datenstruktur mit Bewegungsvektoren

l definierte Verfallszeit bzw. -Geschwindigkeit 2 l einfache Physik ( s = a/2*t + v*t + s0 )

l gezeichnet werden aktive Partikel

l ist das Partikel "verglüht", wird es aus der Aktivliste entfernt

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 10 Jake2 – Phase II g Motivation war mit den ersten sichtbaren Ergebnissen gestiegen g Zusammenbau der Einzelteile mit dem Ziel Demo-Replay g Erste Probleme tauchten auf…

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 11 CCààJavaJava NightmareNightmare g zero terminated C strings g signed bytes L g Beispiel:

// WriteInt() sb.data[i++] = (byte) ((c & 0xff)); sb.data[i++] = (byte) ((c >>> 8) & 0xff); sb.data[i++] = (byte) ((c >>> 16) & 0xff); sb.data[i++] = (byte) ((c >>> 24) & 0xff);

// ReadInt() c = (msg_read.data[msg_read.readcount] & 0xff) | ((msg_read.data[msg_read.readcount + 1] & 0xff) << 8) | ((msg_read.data[msg_read.readcount + 2] & 0xff) << 16) | ((msg_read.data[msg_read.readcount + 3] & 0xff) << 24);

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 12 CCààJavaJava NightmareNightmare g Zuweisungsoperator l C: es wird kopiert (auch ganze Strukturen)

l Java: es werden Objektreferenzen zugewiesen g Ergebnis: seltsame Effekte g Beispiel: // C ent->current = *state; // Java ent.current.set(state);

public void set(entity_state_t from) { number = from.number; Math3D.VectorCopy(from.origin, origin); Math3D.VectorCopy(from.old_origin, old_origin);

modelindex = from.modelindex; ... }

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 13 CCààJavaJava NightmareNightmare g Adapter statt function pointer:

static xcommand_t List_f = new xcommand_t() { public void execute() { ... } }; g Problem: Rekonstruktion der zugewiesenen Adapter in Savegames g Lösung: Classloader-Trick in abstrakter Adapter-Klasse

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 14 Wie langsam ist Java wirklich?

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 15 Jake2Jake2 aufauf derder CeBitCeBit 20042004

g Ergebnis war überraschend g Idee: Anruf bei

à Einladung zum Meeting auf der CeBit g Kommerzielle Verwertung schwierig… g Treffen mit Jamba (Handy Spiele?)

àVeröffentlichung bei Sourceforge

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 16 Sourceforge

g CVS g Downloads g Screenshots g Bug tracker g Task manager g Forum g Mailing Lists g Donation system

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 17 Sourceforge: Bug tracking

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 18 Jake2Jake2 gehtgeht OpenOpen SourceSource g Interesse von Sun (jogl team) und Apple (JDK team) g Showcase auf der Sun JavaOne in San Francisco g Gleichzeitig Showcase auf der WWDC (apple‘s world wide developer conference) g Jake2 heizte Diskussion „C++ vs. Java“ in verschiedenen Foren an (siehe slashdot.org)

à Insbesondere die Benchmarktabelle…

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 19 Jake2 – Benchmarks

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 20 Jake2 - Optimierung g JNI (Java native interface)

l Overhead durch den Wechsel zwischen Java-Heap und C-Heap

l Anzahl der Aufrufe an *.dll bzw. *.so minimieren

l z.B. Vertexarrays mit DirectBuffers (java.nio package) g Wo und wie liegen die Objekte im Speicher?

l Cache-Hits?!

l z.B. Baumstrukturen in Arrays organisieren und danach verketten g Variablen so spät wie möglich definieren g Vermeiden von lokalen Müllobjekten (GC wird belastet)

l Java legt keine Strukturen auf den Stack

l (soll sich bei Java 6.0 "Mustang" ändern)

l z.B.: temporäre float[] für Vektoren kurze Lebensdauer, aber Speicheranforderung

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 21 Java Web Start

g Ersatz für Applets g Verteilte Bibliotheken (jogl wird von Sun geladen) g Signieren von Jar-Files g Keine Programmänderungen nötig g XML Startdatei (JNLP java network launch protocol)

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 22 Jake2 play now!

Jake2 läuft per Mausklick aus dem Browser g auf jedem Betriebssystem mit Java (JRE1.4.2) oder neuer g und benötigt nur einfache User-Berechtigungen

g http://www.bytonic.de/html/jake2_webstart.html

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 23 Fazit

Java: g für Desktop-Anwendungen einsetzbar g Speicher: 40 MB (C++ Quake) 100 MB (Jake2) g Fixkosten: 50 – 80 MB für VM und JRE g Variable Kosten: Extra Speicher für Objekt-Verwaltung des Garbage Collectors g Class sharing im JDK 1.5.0: Start 2-3 mal schneller, spart OS-Speicher

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 24 Todo

g Source code aufräumen

g Weiteres Profiling

l Speicherverbrauch optimieren

g Dokumentieren

g Release 1.0

g Sich um die Fan-Gemeinde kümmern

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 25 Danke für die Aufmerksamkeit,

Dipl.-Ing. Carsten Weiße, Dipl.-Inf. René Stöckel

http://www.bytonic.de

Jake2 - Quake || meets Java 135. Unix Stammtisch TU Chemnitz 26