So führen Sie ein automatisches Update eines Online-Spieleclients durch

    In diesem Artikel werde ich darüber sprechen, wie ich ein Auto-Update-System für ein Client-Online-Spiel erstellt habe. Link zur Quelle (Delphi) am Ende des Artikels. Tatsächlich habe ich diese Funktion in meinen beiden Spielen implementiert, und wenn der erste Pancake (im Spectromancer-Spiel) etwas klumpig ausfiel, erwies sich die zweite Implementierung als sehr praktisch und effektiv. Dies ist mein erster Artikel über Habré, also nicht härter zuschlagen, sondern auf die Mängel in den Kommentaren hinweisen :)

    Spielaktualisierungsalgorithmus


    • Überprüfen Sie die Version auf Aktualisierungen.
    • 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 in Übereinstimmung mit der Liste.
    • Einen aktualisierten Client starten.

    Versionskontrolle


    Zunächst fragt der Client beim Start den Server nach der Nummer der aktuellen Version (X) und der Nummer des zulässigen Minimums ohne Aktualisierung (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, wird die Versionsnummer vom Parameter übergeben. Auf diese Weise können Sie das Spiel auf eine beliebige auf dem Server verfügbare Version aktualisieren und diese sogar verringern. Wenn der Parameter nicht übergeben wird, fordert das Dienstprogramm selbst die aktuelle Versionsnummer vom Server an. Die Versionsnummer ist nur eine Ganzzahl, das Nummerierungsschema kann ein beliebiges 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 merkwürdiges Flackern auf dem Bildschirm überhaupt nicht das ist, was wir brauchen. Das Antwort-Timeout müsste etwas dauern, und der Client nimmt es zum Laden / Entpacken der schwersten JPEGs. Du kannst auch nicht zu lange warten: Der Spieler hat das Spiel gestartet - aber nichts passiert auf dem Bildschirm, ein Durcheinander. Wenn daher innerhalb von 1,0 s. Die Antwort vom Server ist nicht angekommen - 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 Meldung über die Notwendigkeit, den Client zu aktualisieren, oder darüber, dass der Server nicht verfügbar ist.

    Dateiliste herunterladen


    Bei Kenntnis der Versionsnummer lädt das Aktualisierungsdienstprogramm die Liste der Dateien herunter: [base_ur]>/[версия]/filelist
    Dies ist nur eine Liste der CSV-Dateien mit Prüfsummen sowie der Größen in komprimierter und unkomprimierter Form. Jede Zeile sieht folgendermaßen aus:
    18*Priest.tga;1053151921D9;91719;107372
    Hier bedeutet „18 *“, dass 18 Zeichen im Dateinamen sind die gleichen wie in der vorherigen Datei. Da Dateien in der Regel in alphabetischer Reihenfolge abgelegt werden und die Pfade lang sein können, wird die Größe der Listendatei erheblich verringert. Für einen Webserver, auf dem die Komprimierung nicht aktiviert ist, bedeutet dies, dass die Datei schneller heruntergeladen 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, beginnt es, sie auf Aktualisierungen zu überprüfen. Fehlt die Datei im Ordner des Spiels oder ist ihre Prüfsumme unterschiedlich, wird sie der Download-Warteschlange hinzugefügt. Gleichzeitig können nicht mehr als 2 Dateien geladen werden - das reicht völlig aus, damit der Download einerseits nicht verlangsamt, andererseits aber sequentiell abläuft.



    Ein besonderes Thema ist die Fortschrittsanzeige. 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 wurde, können wir bereits einige Informationen anzeigen. Tatsächlich zeigt der Fortschritt die Download-Warteschlange an: Wie viel muss heruntergeladen werden und wie viel wurde bereits heruntergeladen?

    Heruntergeladene Dateien werden sofort entpackt und in einem temporären Ordner gespeichert, ich benutze die Bibliothek zur Komprimierung zlib.

    Wenn die gesamte Liste der Dateien verarbeitet wurde und alle Downloads abgeschlossen sind, prüft das Dienstprogramm changes.txt, ob die Datei vorhanden ist, und zeigt sie an, sofern sie vorhanden ist. Der Benutzer wird aufgefordert, den Aktualisierungsvorgang zu starten. Vor dem Klicken auf die Schaltfläche "Aktualisieren" wurden noch keine Änderungen am Ordner des Spiels vorgenommen, sodass Sie dies ohne Probleme ablehnen können.

    Übrigens: Wenn der Benutzer den Download unterbricht oder die Installation ablehnt, muss er das nächste Mal nicht alle Dateien erneut herunterladen: Vor dem Herunterladen der nächsten Datei überprüft das Dienstprogramm das Vorhandensein im temporären Ordner. Wenn die Prüfsumme übereinstimmt, wird der Download als erfolgreich angesehen.



    Wenn Sie jedoch auf "Update" klicken, startet das Dienstprogramm ein anderes Dienstprogramm - " InstallUpdate.exe ", und es 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 über Administratorrechte verfügen. Das Herunterladen des Updates ist dagegen kontraindiziert. Denn wenn Sie kein glücklicher Besitzer eines EV-Codesignaturzertifikats sind, wird beim Ausführen des Prozesses als Administrator das UAC-Fenster angezeigt. Und wenn der Spieler beim Start des Spiels statt der üblichen Benutzeroberfläche Folgendes sieht:



    ... dann ist dies zumindest ein Grund, sich vor dem Start in Acht zu nehmen oder sich sogar ganz zu weigern. Eine andere Sache, mit der manuellen Zustimmung, das Update zu installieren - in diesem Zusammenhang wird das UAC-Fenster normal wahrgenommen. Leider kann ein Prozess unter Windows seine Rechte zur Laufzeit nicht erhöhen. Diese Eigenschaft wurde seit dem Start nicht geändert. Daher verwende ich zwei separate Dateien. Eigentlich GetNewVersion.exeundInstallUpdate.exe- Dies ist ein und 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 Spiele-Client-Dateien aus dem temporären Ordner in den Spiele-Ordner. Anschließend wird der aktualisierte Client gestartet und beendet. In diesem Fall kann die Datei aktualisiert werden GetNewVersion.exe.

    Alle Aktionen sowie auftretende Fehler werden im Protokoll detailliert protokolliert, was beim Debuggen sehr hilfreich ist.

    Der Prozess der Vorbereitung einer neuen Version


    Wir haben das Update-Betriebsschema aus der Sicht des Spielclients untersucht, aber wie lässt sich alles zum Laufen bringen? Um neue Builds vorzubereiten, habe ich ein anderes Dienstprogramm geschrieben - CompressBuild . Es durchsucht einen Ordner rekursiv, komprimiert Dateien mit der Deflate-Methode und fügt Informationen dazu in die Dateiliste ein filelist. Nach der Komprimierung wird das Symbol "_" an den Dateinamen angehängt. Komprimierte Dateien werden nicht erneut komprimiert. Falls erforderlich, können nur einzelne Dateien im Erstellungsordner 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 gelangen einfach nicht in filelistden Client und werden beim Aktualisieren nicht beschädigt.

    Um einen neuen Build vorzubereiten, muss ich also:

    1. Den Ordner \masterin den Ordner kopieren. \[номер_версии]
    2. CompressBuild ausführen , wodurch die darin enthaltenen Dateien gepackt und eine Liste von ihnen erstellt werden.
    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 die Benutzer beim Upgrade eine neue Version.

    Nun, Ordner mit alten Builds auf dem Server können gelöscht werden, um keinen Speicherplatz zu belegen.

    Fazit


    Natürlich ist mein Update-System nicht perfekt und nicht fehlerfrei. Wenn beispielsweise eine Datei im Client gelöscht wurde, verbleibt sie bei den Playern. Wenn die Datei umbenannt wurde, wird sie als neu heruntergeladen und die alte Instanz wird nicht gelöscht. Sie können das Aktualisierungsdienstprogramm natürlich ändern, indem Sie Befehle zum Löschen / Umbenennen von Dateien zur Dateiliste hinzufügen. Im Allgemeinen sind solche Probleme jedoch für mein Spiel nicht relevant, sodass ich mich nicht darum gekümmert habe.

    Nun, die Quelle kann hier entnommen werden: astralheroes.com/files/UpdaterSrc.zip
    (in Delphi-2006 / Turbo Delphi kompiliert, ich kann nicht für andere Compiler bürgen).

    Jetzt auch beliebt: