Habe vorhin mit einem Bekannten ein wenig diskutiert und wir sind nicht wirklich zu einer Loesung gekommen. Ich finde aber, dass es eine interessante Fragestellung ist und es da ja verschiedene Moeglichkeiten gibt.
Also erst einmal das Szenario: Ein Spieler moechte mit seiner Flotte von A nach B fahren. Alle Spieler in gewisser Reichweite mit einer gewissen Sonarstaerke sollen in der Lage sein, diese Flotte zu sehen. Es soll weiterhin gewisse Automatismen geben, so dass z.B. andere Schiffe automatisch attackieren was sich bis auf X Einheiten an sie annaehert. Beide Faelle muessen die aktuelle Position des Geschwaders zum jeweiligen Zeitpunkt kennen.
Das Event, das bei der Ankunft getriggert wird, ist komplett unabhaengig hiervon, kann also vernachlaessigt werden.
Nun ergeben sich im Grunde drei Implementationsmoeglichkeiten (wenn ich von Client spreche, meine ich nicht den Browser, sondern z.B. die KI der Schiffe im Daemon oder das Web Backend):
1. Regelmaessige Updates (minuetlich?) direkt in der Geschwaderdatenbank, also quasi x += delta_x * geschwindigkeit * differenz_seit_update und simples Auslesen der aktuellen Position ohne Logik, wobei per WHERE effizient die Datenmenge begrenzt werden kann und der Client nicht mit Daten handeln muss, die ihn nichts angehen.
Vorteil: Einfachste Implementation, wenig Berechnungen
Nachteil: Viele Datenbank Schreibzugriffe (und damit Tablelocks), Granularitaet auf Minuten begrenzt (nicht so tragisch, da dies nur ein paar Pixeln Bewegung entspricht und der Client auch per xmlhttprequest nur in minuetlichen oder groesseren Abstaenden updates bekommt).
2. Keine Updates in der Datenbank, diese enthaelt nur Start- und Zielkoordinaten, Geschwindigkeit und Starrtzeitpunkt. Der Client berechnet die aktuelle Position dabei live.
Problem dabei, man kann die Position nicht einfach einschraenken und muss erst einmal ALLE Positionen berechnen, oder zumindest einen Forecast machen, welche Geschwader in der Naehe sein koennten und dann die genaue Position all jener Berechnen. Hier gibt es dann noch zwei Alternativen:
a) Berechnung komplett im Client = Daten ueber alle Geschwader muessen transferiert werden
b) Berechnung teils im Client, teils in der Datenbank = Man kann die Daten einschraenken, belastet aber zusaetzlich die Datenbank mit der Berechnung
Vorteil: Nur Datenbank Readzugriffe, Keine Einschraenkungen bei der Granularitaet
Nachteil: Aufwendige, Komplexe Berechnungen, mehr Datenbankbelastung, der Client sieht Daten die ihn nichts angehen, unter Umstaenden umfangreiche Berechnungen in der Datenbank noetig (b)), viel mehr Aufwand beim Readzugriff, der haeufig sein kann
3. Bei Geschwaderstart wird der Kurs vorberechnet. Der Rechenaufwand von 2. wird hier auf den Missionsstart verlagert, spaetere Lesezugriffe (die wahrscheinlich mehr sein werden) sind fast so simpel wie in 1., es entfaellt jedoch das minuetliche Update, die Granularitaet ist dennoch nicht feiner.
Vorteil: Weniger Rechenaufwand als in 2, gute Read Performance, kein Locking das mit der Geschwadertabelle kollidiert
Nachteil: Bei Kursaenderungen oder Geschwindigkeitsaenderungen muss alles neu berechnet werden, viel DB Write und Berechnungsaufwand beim Missionsstart, sehr viel DB IO und damit Speicher- und Plattenbelastung, Granularitaet auf Minuten begrenzt (nicht so tragisch)
Was denkt ihr?
Achja, edit:
23:34 <+Artrey> Das betrifft vor allem das Verhaeltnis von Berechnungen in Backend, Daemon und DBMS
23:34 <+Artrey> und damit Fragen der Skalierbarkeit