In diesen Tagen versuche ich, die Architektur eines neuen MMORPG-Handyspiels für mein Unternehmen zu entwerfen. Dieses Spiel ähnelt Mafia Wars, iMobsters oder RISK. Grundlegende Idee ist, eine Armee vorzubereiten, um Ihre Gegner (Online-Benutzer) zu bekämpfen.
Ich habe bereits an mehreren mobilen Apps gearbeitet, aber das ist etwas Neues für mich. Nach viel Mühe habe ich eine Architektur entwickelt, die anhand eines allgemeinen Flussdiagramms veranschaulicht wird:
Wir haben uns für das Client-Server-Modell entschieden. Es wird eine zentrale Datenbank auf dem Server geben. Jeder Client verfügt über eine eigene lokale Datenbank, die mit dem Server synchronisiert bleibt. Diese Datenbank fungiert als Cache zum Speichern von Dingen, die sich nicht häufig ändern, z. B. Karten, Produkte, Inventar usw.
Mit diesem Modell bin ich nicht sicher, wie ich die folgenden Probleme angehen soll:
- Wie lassen sich Server- und Client-Datenbanken am besten synchronisieren?
- Soll ein Ereignis in der lokalen Datenbank gespeichert werden, bevor es auf dem Server aktualisiert wird? Was passiert, wenn die App aus irgendeinem Grund beendet wird, bevor Änderungen an der zentralen Datenbank gespeichert werden?
- Dienen einfache HTTP-Anforderungen zur Synchronisierung?
- Woher wissen, welche Benutzer aktuell angemeldet sind? (Eine Möglichkeit besteht darin, dass der Client alle x Minuten eine Anforderung an den Server sendet, um zu benachrichtigen, dass er aktiv ist. Andernfalls wird ein Client als inaktiv eingestuft.)
- Sind clientseitige Validierungen ausreichend? Wenn nicht, wie kann eine Aktion rückgängig gemacht werden, wenn der Server etwas nicht validiert?
Ich bin nicht sicher, ob dies eine effiziente Lösung ist und wie sie skaliert. Ich würde mich sehr freuen, wenn Leute, die bereits an solchen Apps gearbeitet haben, ihre Erfahrungen teilen können, die mir helfen könnten, etwas Besseres zu finden. Danke im Voraus.
Zusätzliche Information:
Die Client-Seite ist in der C ++ - Spiel-Engine Marmelade implementiert. Dies ist eine plattformübergreifende Spiele-Engine, mit der Sie Ihre App auf allen gängigen mobilen Betriebssystemen ausführen können. Threading können wir sicher erreichen und das zeigt auch mein Flussdiagramm. Ich plane, MySQL für Server und SQLite für Client zu verwenden.
Dies ist kein rundenbasiertes Spiel, daher gibt es nicht viel Interaktion mit anderen Spielern. Der Server stellt eine Liste der Online-Spieler zur Verfügung und Sie können gegen sie kämpfen, indem Sie auf die Schaltfläche "Kampf" klicken. Nach einigen Animationen wird das Ergebnis bekannt gegeben.
Für die Datenbanksynchronisation habe ich zwei Lösungen im Sinn:
- Speichern Sie den Zeitstempel für jeden Datensatz. Verfolgen Sie auch, wann die lokale Datenbank zuletzt aktualisiert wurde. Wählen Sie bei der Synchronisierung nur die Zeilen mit einem größeren Zeitstempel aus und senden Sie sie an die lokale Datenbank. Behalten Sie ein isDeleted-Flag für gelöschte Zeilen bei, damit sich jede Löschung einfach wie eine Aktualisierung verhält. Ich habe jedoch ernsthafte Zweifel an der Leistung, da wir bei jeder Synchronisierungsanforderung die gesamte Datenbank scannen und nach aktualisierten Zeilen suchen müssten.
- Eine andere Technik könnte darin bestehen, ein Protokoll über jede Einfügung oder Aktualisierung zu führen, die für einen Benutzer ausgeführt wird. Wenn die Client-App nach einer Synchronisierung fragt, rufen Sie diese Tabelle auf und finden Sie heraus, welche Zeilen welcher Tabelle aktualisiert oder eingefügt wurden. Sobald diese Zeilen erfolgreich an den Client übertragen wurden, entfernen Sie dieses Protokoll. Aber dann überlege ich, was passiert, wenn ein Benutzer ein anderes Gerät verwendet. Gemäß der Protokolltabelle wurden alle Aktualisierungen für diesen Benutzer übertragen, aber tatsächlich wurde dies auf einem anderen Gerät durchgeführt. Daher müssen wir möglicherweise auch das Gerät im Auge behalten. Das Implementieren dieser Technik ist zeitaufwändiger, aber nicht sicher, ob sie die erste ausführt.