Konsolen- und PC-Spiele haben manchmal Patches, um Fehler zu beheben, die die Entwickler verpasst haben / für die sie keine Zeit hatten.
Meine Frage ist, wie funktionieren diese?
Manchmal sind die Patch-Dateien einige Megabyte groß. Ich verstehe nicht, wie eine kleine Datei ein konformes Programm verändern kann.
Antworten:
Es gibt mehrere Möglichkeiten, dies zu tun. Am einfachsten wäre es, die beiden Dateien per XOR zu verknüpfen und zu komprimieren (GZIP oder so weiter). Die Theorie dahinter ist, dass man hoffentlich eine große Folge von Nullen bekommen kann (lange Folgen gleicher Werte lassen sich gut komprimieren).
Sie können dieses Konzept weiterentwickeln und versuchen, Bereiche der beiden Dateien zu finden, in denen die Daten identisch sind, und sie vollständig weglassen.
Schließlich können Sie die Struktur jedes Dateityps zu Ihrem Vorteil nutzen. In einer EXE-Datei können Sie beispielsweise jede Methode einzeln packen (nur die, die geändert wurden) und die EXE-Datei während der Patch-Anwendung selbst wiederherstellen. Bedenken Sie jedoch, dass dies im Bereich des Overkills sehr wahrscheinlich ist und sich möglicherweise nicht lohnt (der Gewinn gegenüber einem einfachen Bdiff rechtfertigt möglicherweise nicht die zusätzliche Komplexität, die in der freien Wildbahn brechen könnte). Als weiteres Beispiel könnten Sie Diff-Dateien für Skripte verwenden.
Die meisten Patch-Systeme in freier Wildbahn gehen jedoch den einfachsten Weg: Sie packen nur Dateien, die sich geändert haben - sie versuchen nicht, Änderungen nur innerhalb dieser Dateien zu packen (wahrscheinlich aus gutem Grund sind die meisten Spielinhalte bereits komprimiert und erstellen Patches gegen Hoch Entropie oder komprimierte Daten funktionieren überhaupt nicht .
quelle
Der ausführbare Code eines Spiels befindet sich nicht immer nur in der ausführbaren Datei, sondern ist häufig in mehrere dynamische Bibliotheken (z. B. das Spiel, Grafik- und Sound-Engines), die eigentliche ausführbare Datei und möglicherweise viele Skripts für verschiedene Zwecke unterteilt.
Ein Patch kann Probleme in einem dieser Teile beheben, ohne dass eine Änderung in allen Teilen erforderlich ist.
Ein anderer Ansatz als das Ersetzen aller geänderten Dateien könnte darin bestehen, einfach ein binäres Diff auf sie anzuwenden und nur die tatsächlichen Unterschiede zu packen, die neu verteilt werden sollen.
(Das funktioniert natürlich nur für Dateien, von denen Sie garantieren können, dass sie nicht vom Benutzer geändert werden.)
quelle
Normalerweise verwenden sie ein binäres Diff-System eines Drittanbieters, um Patches auf die Spieldaten zu verteilen. Die ausführbaren Dateien sind in der Regel klein genug, um vollständig trivial verteilt zu werden.
Die meisten modernen Spiele verfügen über Hunderte von Megadaten (hauptsächlich Texturen, Modelle, Level-Daten usw.). Diese müssen ziemlich oft gepatcht werden. Soweit ich weiß, haben die Verlage normalerweise eine proprietäre Standardmethode, um dies zu tun.
Natürlich gibt es Open-Source-Beispiele. Einige Linux-Distributionen (Fedora?) Verwenden binäre Diffs für ihre Patches. Sie können diese untersuchen und deren Quellcode oder Dokumentation lesen.
quelle
Moderne
diff
Algorithmen können Byte-Sequenzen, die zwei Binärdateien gemeinsam haben, effizient finden. Kein Wunder, wenn Sie darüber nachdenken. Bei der Dateikomprimierung müssen auch identische Bytefolgen gefunden werden.Sobald Sie die Liste identischer Bytesequenzen haben, müssen Sie nur den alten und den neuen Versatz, die Länge und natürlich alles, was völlig neu ist, senden. Empfangsseitig handelt es sich dann um eine unkomplizierte Montage. Kopieren Sie die Bits, die Sie aus der alten Datei behalten möchten, und füllen Sie die neuen Bits aus.
Das Erstellen des Patches wird noch einfacher, wenn Ihr Linker eine MAP-Datei ausspucken kann, in der die Offsets aller Funktionen in der Datei aufgelistet sind.
quelle