Es gibt viele Möglichkeiten, das Versionsproblem zu lösen. Sie können dies tun, indem Sie eine Ladefunktion pro Version haben. Sie können versuchen, den Prozess zu automatisieren, indem Sie (normalerweise über Attribute) die Transformation der Asset-Struktur im Laufe der Zeit beschreiben. Sie können versionenspezifische Überprüfungen innerhalb der Lade- / Speicherfunktionen usw. durchführen .
Ich mag den Ansatz "Beschreibe die Änderungen", finde aber, dass der Versuch, dies über Attribute zu tun, schnell unangenehm wird . Ich würde stattdessen Funktionen verwenden; Implementieren Sie eine Funktion, die Daten in Version N
in Daten in Version N + 1
für alle Ihre entsprechenden Versionen umwandelt . Überprüfen Sie beim Laden die Version mit der neuesten Version. Wenn dies nicht der Fall ist, führen Sie die Daten über alle entsprechenden Versionsfunktionen aus. Speichern Sie immer die neueste Version.
Dies funktioniert am besten, wenn Sie die Transformation durchführen, während sich die Daten noch in einer Laufzeit-Schlüsselwertform befinden. Dies bedeutet, dass Sie wahrscheinlich eine Darstellung für Ihre Daten implementieren möchten, bei der es sich um einen "Runtime Bag of Properties" -Ansatz handelt, da Sie die zugrunde liegende Schlüsselwertform von JSON oder XML nicht verwenden können, wenn Sie über ein eigenes Binärformat verfügen. Wenn Sie dies nicht tun, müssen Sie möglicherweise auch alte Klassendefinitionen beibehalten, was hässlich wird. Die Möglichkeit, Ihre Assets in diesem schlechten Format zu haben, ist auch für die Entwicklung des Spieleditors äußerst nützlich.
Während der Entwicklung, während Sie Ihre Daten iterieren, sprudelt es natürlich auf die neueste Version und Sie können schließlich die alten Versionsfunktionen löschen. Dies ist mehr oder weniger der gleiche Ansatz auf hoher Ebene, mit dem wir Kunstobjekte (wie die Karten) in Guild Wars 2 versioniert haben.
Alles in allem halte ich es für nützlich, sowohl die Text- als auch die binäre Serialisierung für Assets zu unterstützen. Bewahren Sie während der Entwicklung alle Ihre Daten in einem für Menschen lesbaren Format auf, das auf XML oder JSON basiert. Dies kann Ihre Iterationsfähigkeit erheblich verbessern, da Sie keine so komplexen Tools zum Bearbeiten der Daten erstellen müssen. Sie können wieder einfache, schnelle Änderungen von Hand vornehmen.
Zweitens: Nehmen Sie an, Sie möchten sogar noch ein Binärformat für den Versand des Spiels (das die Dateigröße oder die Datei-E / A-Zeiten verbessern kann, was ein berechtigter Wunsch ist), und entwerfen Sie Ihre Serialisierungs- und Deserialisierungs-APIs für die Versionierung. Die Versionsverwaltung ist im Versandkontext immer noch nützlich, da Sie möglicherweise irgendwann Updates oder Fehlerbehebungen versenden möchten. Es gibt einige Dokumente, die die Versionsfunktionen der .NET-Serialisierung und der Boost-Serialisierung beschreiben , die Sie vielleicht interessant finden. Wenn Sie sind sowohl Text als auch Binärformaten unterstützen, stellen Sie sicher , dass Sie sie testen , gelegentlich (oder Build automatisierte Tests zu tun, noch besser).