In diesem Artikel werde ich darüber sprechen, wie ich ein Auto-Update-System für ein Online-Client-Spiel erstellt habe. Link zur Quelle (Delphi) am Ende des Artikels. Tatsächlich habe ich eine solche Funktion in meinen beiden Spielen implementiert, und wenn der erste Pfannkuchen (im Spectromancer-Spiel) etwas klumpig herauskam, erwies sich die zweite Implementierung als sehr praktisch und effektiv. Dies ist mein erster Artikel über Habré, also nicht hart treffen, sondern auf die Mängel in den Kommentaren hinweisen :)
Spielaktualisierungsalgorithmus
- Überprüfen der Version auf Aktualisierung.
- Laden Sie die Liste der Dateien der aktuellen Version herunter.
- Herunterladen neuer oder geänderter Dateien in einen temporären Ordner.
- Installieren des Updates - Bringen Sie die Dateien des installierten Clients gemäß der Liste.
- Starten eines aktualisierten Clients.
Versionsprüfung
Zunächst fragt der Client beim Start den Server nach der Nummer der aktuellen Version (X) und der Nummer des Minimums, das ohne Aktualisierung zulässig ist (Y). Wenn die Client-Version nicht niedriger als Y ist, ist kein Update erforderlich. Andernfalls startet der Client das Update-Dienstprogramm "
GetNewVersion.exe X " und fährt sich selbst herunter.
Wie Sie sehen können, wird die Versionsnummer vom Parameter übergeben. Auf diese Weise können Sie das Spiel auf jede auf dem Server verfügbare Version aktualisieren und sogar senken. Wenn der Parameter nicht übergeben wird, fordert das Dienstprogramm selbst die aktuelle Versionsnummer vom Server an. Die Versionsnummer ist nur eine ganze Zahl, das Nummerierungsschema kann beliebig sein, zum Beispiel entspricht meine Version 1.12 der Nummer 1120.
Die Antwort vom Server kommt nicht sofort und bevor wir sie erhalten, können wir das Spielfenster nicht erstellen, da Sie es möglicherweise sofort schließen müssen und unverständliches Flackern auf dem Bildschirm überhaupt nicht das ist, was wir brauchen. Das Zeitlimit für die Antwort müsste etwas dauern, und der Client ist damit beschäftigt, die schwersten JPEGs zu laden / zu entpacken. Sie können auch nicht zu lange warten: Der Spieler hat das Spiel gestartet - aber auf dem Bildschirm passiert nichts, ein Durcheinander. Wenn daher innerhalb von 1,0 Sekunden. Die Antwort vom Server ist nicht eingetroffen. Das Laden des Spiels wird auf die übliche Weise fortgesetzt. Dies ist keine große Sache: Sobald der Spieler versucht, sich beim Server anzumelden, erhält er eine Nachricht über die Notwendigkeit, den Client zu aktualisieren, oder dass der Server nicht verfügbar ist.
Dateiliste herunterladen
Bei Kenntnis der Versionsnummer lädt das Update-Dienstprogramm die Liste der Dateien unter folgender
[base_ur]>/[]/filelist
herunter:
[base_ur]>/[]/filelist
Dies ist nur eine Liste von CSV-Dateien mit Prüfsummen sowie komprimierten und unkomprimierten Größen. Jede Zeile sieht ungefähr so aus:
18*Priest.tga;1053151921D9;91719;107372
Hier bedeutet "18 *", dass 18 Zeichen im Dateinamen mit der vorherigen Datei identisch sind. Da Dateien normalerweise in alphabetischer Reihenfolge abgelegt sind und die Pfade lang sein können, wird die Größe der Listendatei erheblich gespart. Für einen Webserver, auf dem die Komprimierung nicht aktiviert ist, bedeutet dies, dass die Datei schneller heruntergeladen wird und das Update früher gestartet wird.
Laden Sie neue oder geänderte Dateien herunter
Wir wissen nicht, wie alt der Spielclient ist, möglicherweise wurden einige Dateien manuell geändert oder gelöscht. Wir möchten nicht zu viel herunterladen. Nachdem das Dienstprogramm die Liste der Dateien erhalten hat, überprüft es sie auf Aktualisierungen. Wenn sich die Datei nicht im Ordner des Spiels befindet oder die Prüfsumme anders ist, wird die Datei zur Download-Warteschlange hinzugefügt. Gleichzeitig können nicht mehr als 2 Dateien geladen werden - dies reicht völlig aus, damit der Download einerseits nicht verlangsamt wird, andererseits aber nacheinander erfolgt.

Ein besonderes Thema ist die Anzeige des Fortschritts. Bis die gesamte Liste verarbeitet wurde, wissen wir nicht genau, wie viele Dateien heruntergeladen werden sollen und wie groß sie sind. Sobald jedoch die erste Datei hochgeladen wird, können wir bereits einige Informationen anzeigen. Tatsächlich zeigt der Fortschritt die Download-Warteschlange an: wie viel heruntergeladen werden muss und wie viel bereits heruntergeladen wurde.
Heruntergeladene Dateien werden sofort entpackt und in einem temporären Ordner gespeichert. Ich verwende die
zlib
Bibliothek zur Komprimierung.
Wenn die gesamte Liste der Dateien verarbeitet wurde und alle Downloads abgeschlossen sind, prüft das Dienstprogramm, ob die Datei "
changes.txt
vorhanden ist, und zeigt sie an, falls vorhanden. Der Benutzer wird aufgefordert, den Aktualisierungsvorgang zu starten. Bevor Sie auf die Schaltfläche "Aktualisieren" klicken, wurden noch keine Änderungen am Ordner des Spiels vorgenommen, sodass Sie sich problemlos abmelden können.
Übrigens, wenn der Benutzer den Download unterbricht oder die Installation ablehnt, muss er beim nächsten Mal nicht alle Dateien erneut herunterladen: Vor dem Herunterladen der nächsten Datei überprüft das Dienstprogramm das Vorhandensein im temporären Ordner, und wenn die Prüfsumme übereinstimmt, wird der Download als erfolgreich angesehen.

Wenn Sie jedoch auf "Aktualisieren" klicken, startet das Dienstprogramm ein anderes Dienstprogramm - "
InstallUpdate.exe " - und
fährt sich selbst herunter.
Update installieren
Warum brauche ich ein anderes Dienstprogramm? Es ist ganz einfach: Um die Spieledateien zu aktualisieren, müssen Sie sie mit Administratorrechten ausführen. Das Herunterladen des Updates ist jedoch im Gegenteil kontraindiziert. Denn wenn Sie kein glücklicher Besitzer eines EV-Code-Signaturzertifikats sind, wird beim Starten des Prozesses mit Administratorrechten das UAC-Fenster angezeigt. Und wenn der Spieler beim Starten des Spiels anstelle der üblichen Benutzeroberfläche Folgendes sieht:

... dann ist dies zumindest ein Grund, sich vor dem Start zu hüten oder ihn sogar ganz abzubrechen. Eine andere Sache, mit der manuellen Zustimmung zur Installation des Updates - in diesem Zusammenhang wird das UAC-Fenster normal wahrgenommen. Leider kann ein Prozess in Windows seine Rechte zur Laufzeit nicht erhöhen - diese Eigenschaft wurde seit dem Start nicht geändert. Daher verwende ich zwei separate Dateien. Tatsächlich sind
GetNewVersion.exe
und
InstallUpdate.exe
dasselbe Dienstprogramm, die Dateien sind identisch. Die Aktion wird durch die übertragenen Parameter und den Namen der ausführbaren Datei bestimmt.
Beim Start kopiert InstallUpdate die Spielclientdateien aus dem temporären Ordner in den Spielordner, startet dann den aktualisierten Client und wird beendet. In diesem Fall kann auch die Datei
GetNewVersion.exe
aktualisiert werden.
Alle Aktionen sowie auftretende Fehler werden im Protokoll detailliert protokolliert. Dies ist sehr nützlich für das Debuggen.
Der Prozess der Vorbereitung einer neuen Version
Wir haben das Update-Schema aus Sicht des Spiel-Clients untersucht, aber wie kann alles funktionieren? Um neue Builds vorzubereiten, habe ich ein anderes Dienstprogramm geschrieben -
CompressBuild . Es scannt rekursiv einen Ordner, komprimiert Dateien mit der Deflate-Methode und schreibt Informationen darüber in die Dateiliste -
filelist
. Nach der Komprimierung wird das Symbol "_" an den Dateinamen angehängt. Komprimierte Dateien werden nicht erneut komprimiert. Daher können bei Bedarf nur einzelne Dateien im Build-Ordner aktualisiert werden. CompressBuild aktualisiert sie nur.
Einige Dateien im Spieleclient, die sich während des Betriebs ändern, enthalten beispielsweise Einstellungen. Solche Dateien müssen ignoriert werden, das Dienstprogramm entnimmt die entsprechenden Vorlagen aus der Ausschlussdatei. Das heißt, diese Dateien werden einfach nicht in die
filelist
und verderben beim Aktualisieren nicht auf dem Client.
Um einen neuen Build vorzubereiten, brauche ich also:
1. Kopieren Sie den Ordner
\master
nach
\[_]
2. Führen Sie
CompressBuild aus , das die darin enthaltenen Dateien packt und eine Liste erstellt.
3. Laden Sie alles auf die Website des Spiels hoch.
4. Ändern Sie auf dem Spieleserver die Nummer der aktuellen Version in die gerade heruntergeladene Nummer. Voila!
Ab sofort erhalten Benutzer beim Aktualisieren eine neue Version.
Nun, Ordner mit alten Builds auf dem Server können gelöscht werden, um keinen Speicherplatz zu beanspruchen.
Fazit
Natürlich ist mein Update-System nicht perfekt und nicht ohne Mängel. Wenn beispielsweise eine Datei im Client gelöscht wurde, verbleibt sie bei den Spielern. Wenn die Datei umbenannt wurde, wird sie als neue heruntergeladen und die alte Instanz wird nicht gelöscht. Sie können das Update-Dienstprogramm natürlich verfeinern, indem Sie Befehle zum Löschen / Umbenennen von Dateien zur Liste der Dateien hinzufügen. Im Allgemeinen sind solche Probleme jedoch für mein Spiel nicht relevant, sodass ich mich nicht darum gekümmert habe.
Die Quelle finden Sie hier:
astralheroes.com/files/UpdaterSrc.zip(kompiliert in Delphi-2006 / Turbo Delphi, ich kann nicht für andere Compiler bürgen).