Jake2
uakeIIuakeII meetsmeets JavaJava
Dipl.-Ing. Carsten Weiße Dipl.-Inf. René Stöckel
http://www.bytonic.de
Jake2 - Quake || 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 source code 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 Sun Microsystems
à 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