Archive for März, 2009

MMO mit Java/J2EE? (Teil 2)

Aktives Rendern zur Darstellung von Animationen

Zur Darstellung der Clientgrafiken und Animationen für den MMO Prototyp verwende ich ein eigenes Canvas, welches mit einem Thread die Grafiken in kurzen Zeitabständen zyklisch neuzeichnet, dadurch lassen sich durch den Austausch der Grafiken animationen erzielen. Der Austausch kann an die Eingabe des Clients, oder an die Aktualisierung der Spieldaten des Servers für NSP’s (Nicht-Spieler Charaktere) gekoppelt sein.

Exemplarische (nicht vollständige) Animationssequenz

Exemplarische (nicht vollständige) Animationssequenz

Mein bisheriges Canvas rief in run()-Methode des Threads periodisch repaint() auf. Da repaint() aber keinesfalls garantiert von der JVM aufgerufen wird, sondern in eine Queue eingestellt wird, ist eine reibungslose Animationsdarstellung nicht gewährleistet. Hier ergibt sich eine Verbesserung durch den Einsatz des sog. Active Rendering, die (vereinfachte) Implementierung dazu sieht folgendermaßen aus:


1 private void activeRendering() {
2   Graphics g = this.getGraphics();
3   if (g != null) {
4     g.drawImage(offscreenImage, 00null);
5     Toolkit.getDefaultToolkit().sync();
6     g.dispose();
7   }
8 }

Toolkit.getDefaultToolkit().sync(); Stellt die Aktualisierung des Displays unter Linux sicher. (Quelle: Killer Game Programming, Andrew Davidson)

No Comments

Oracle XE: Ora-12638

Gelegentlich kann es bei einer Oracle XE unter Windows zu folgendem Fehler kommen:


UDI-00008: Vorgang hat ORACLE-Fehler generiert 12638
ORA-12638: Abrufen der ID-Daten nicht erfolgreich



In diesem Fall trat der Fehler im Zusammenhang mit einem Datenimport auf. Erfahrungsgemäß und durch Berichte anderer User kann das Problem mit einem Neustart des Datenbankservices behoben werden. Sollte dies jedoch nicht der Fall sein, so kann das Ändern der Einstellung SQLNET.AUTHENTICATION_SERVICES= (NTS) auf SQLNET.AUTHENTICATION_SERVICES= (NONE) in der Datei sqlnet.ora das Problem beseitigen. Die Änderung bewirkt, dass nicht mehr die native Windows Security beim Login verwendet wird, sondern nur mehr User und Passwort.

No Comments

MMO mit Java/J2EE? (Teil 1)

MMO, oder Massively Multiplayer Online Games auf Basis von Java und J2EE? Die Antwort auf diese Frage werde ich in einer Reihe von Artikeln versuchen zu beantworten. Ziel ist eine Machbarkeitsstudie auf Basis eines Prototypen zu entwickeln.

1.1 Einführung

Ein Massively Multiplayer Online Game ist ein Computerspiel, welches ausschließlich über das Internet gespielt werden kann und bei dem gleichzeitig mehrere hundert oder tausend Spieler sich in einer persistenten Spielumgebung treffen und interagieren können. Vertreter bekannter Spiele sind z.B. World of Warcraft, Guildwars oder Warhammer Online.

1.2. Architektur, Komponenten

Ein MMO Game besteht grob aus den Schichten Präsentation (Client), Geschäftslogik (Server) und Datenhaltung (Server), also der klassischen Architektur die mit J2EE realisierbar ist. Folgende Grafik beschreibt die Architektur eines MMO Games:

MMO Architektur

MMO Architektur

Clientseite
Die Präsentationsschicht wird durch den Gameclient repräsentiert. Der Gameclient beinhaltet grob folgende Funktionen:

  • Login Funktionalität, zum Einloggen in die Spielwelt
  • Patch Funktionalität, zum automatischen Bezug und Installation von Softwareupdates
  • Darstellung der Spielwelt und der Interaktionen

Serverseite
Die Serverseite umfasst eine Reihe von Servern mit unterschiedlichen Aufgaben. Die folgende Trennung ist aufgrund der Lastverteilung üblich und wird bei den bekannten MMO’s so praktiziert:

  • Accountserver: Üblicherweise mit Web-basierter Oberfläche zur Verwaltung der Accountdaten, abgelegt in der Accountdatenbank
  • Loginserver: Server zum Überprüfen der Accountdaten und des Patchstandes
  • Sessionserver: Server zum Überprüfen der Gültigkeit der aktiven Session und zur Weiterleitung der Anfragen an den Patch- und Gameserver
  • Patchserver: Server zur Verteilung von Softwareupdates, hier sind mehrere Möglichkeiten denkbar, der Download von Patches über http oder ftp. Auch verteilte Ansätze sind denkbar, so benutzt World of Warcraft Bittorrent als Verteilungssystem.
  • Gameserver: Der eigentliche Spielserver, der die Spielewelt hostet und die Interaktionen der Spieler verwaltet und die Spielzustände in der Game-DB festhält.

1.3. Ausblick

Vorweg würde ich behaupten, dass sich J2EE für die Umsetzung eines MMO’s prinzipiell eignet, die entscheidende Frage stellt sich meines Erachtens, ob eine akzeptable Performance des Gameservers erreicht werden kann oder nicht. Von dieser Fragestellung ist die Anzahl der gleichzeitig bedienbaren Clients pro Server abhängig und damit beantwortet sich die Frage, ob ein MMO realisiert werden kann.

No Comments

jClaim – ICQ mit Java

Freie ICQ Implementierungen gibt es mittlerweile einige, jedoch kaum welche in Java. Ein Vertreter ist jClaim, neben einer Bibliothek zum Erstellen einer eigenen Anwendung bietet jClaim auch einen fertigen Client, der direkt über Webstart gestartet werden kann. Ein simpler Client ist schnell realisiert:


01 package messaging;
02 
03 import com.itbs.aimcer.commune.joscar.ICQConnection;
04 import com.itbs.util.GeneralUtils;
05 import controller.MessengerGroupFactory;
06 import controller.MessengerContactFactory;
07 import controller.LogEventHandler;
08 
09 public class JavaICQ {
10 
11   public static void main(String[] argsthrows Exception {
12     try {
13       ICQConnection conn = new ICQConnection();
14       conn.assignGroupFactory(new MessengerGroupFactory());
15       conn.assignContactFactory(new MessengerContactFactory());
16       conn.setUserName("icqnumber");
17       conn.setPassword("icqpass");
18       conn.addEventListener(new LogEventHandler());
19       conn.connect();
20       while (true) {
21         GeneralUtils.sleep(60 60 1000);
22       }
23     catch (Exception e) {
24       throw new RuntimeException(e);
25     }
26   }
27 
28 }

Statt des LogEventHandlers kann auch der BotEventHandler, der standardmäßig in der Bilbliothek enthalten ist, verwendet werden.
Bei der Einfachheit dieser Implementierung bleibt es aber auch, so ist es z.B. mit der Bibliothek derzeit nur möglich vom Online Status auf den Away Status zu schalten. Die umfangreichen Funktionen, die der offizielle ICQ Client bietet, sind mit jClaim leider nicht zugänglich.

No Comments