バージョン管理の問題を処理する方法はたくさんあります。バージョンごとに1つのロード機能を使用してそれを行うことができます。(通常は属性を介して)アセット構造の経時的な変換を記述してプロセスの自動化を試みることができます。ロード/保存機能内でバージョン固有のチェックを実行できます。 。
私は「変更を説明する」アプローチが好きですが、属性を介してそれを実行しようとすると、ぎこちなく速くなることがわかりました。代わりに関数を使用します。バージョンのN
データをN + 1
適切なすべてのバージョンのバージョンのデータに変換する関数を実装します。ロード時に、最新バージョンに対してバージョンを確認し、最新でない場合は、適切なすべてのバージョン管理関数を使用してデータを実行します。常に最新バージョンを保存してください。
これは、データがまだ実行時のキーと値の形式であるときに変換を行う場合に最適です。つまり、独自のバイナリ形式を持っている場合、JSONまたはXMLの基になるキーと値の形式を使用できないので、「プロパティのランタイムバッグ」アプローチであるデータの表現を実装することになるでしょう。これを行わない場合は、また醜い取得され、周りの古いクラス定義を維持する必要があるかもしれません。アセットをこのプロパティの不良フォーマットに含めることができることは、ゲームエディターの開発にも非常に役立ちます。
開発中にデータを反復処理すると、自然に最新バージョンにバブルアップし、最終的に古いバージョン管理機能を削除できます。これは、ギルドウォーズ2でアートアセット(マップなど)をバージョン管理するために使用した高レベルのアプローチとほぼ同じです。
さて、以上がすべてのことですが、アセットのテキストシリアル化とバイナリシリアル化の両方をサポートすると便利だと思います。開発中は、すべてのデータをXMLまたはJSONに基づいた人が読める形式にしてください。データの編集に関するそのような複雑なツールを構築する必要がないため、これにより反復能力が大幅に向上します。手で簡単に素早く調整できるように戻すことができます。
2つ目は、ゲームの出荷にバイナリ形式が必要な場合でも(ファイルサイズやファイルのIO時間を改善できるため、これは正当な目的です)、バージョン管理を処理するシリアル化APIとシリアル化解除APIを設計します。ある時点でアップデートまたはバグ修正を出荷したい場合があるため、バージョン管理は出荷のコンテキストでは依然として役立ちます。.NETシリアライゼーションとBoostのシリアライゼーションのバージョン管理機能を説明したドキュメントがいくつかあります。テキスト形式とバイナリ形式の両方をサポートする場合は、それらを時々テストするようにしてください(または、自動テストを作成して、それをさらに改善します)。