手続き的に生成されたレベルを使用して、XNA でローグライク ゲームを作成しています。
まったく新しいレベルを生成するのに約 1 秒かかりますが、現在の方法ではシリアライズに約 4 秒、デシリアライズに約 8 秒かかります。また、ファイルは巨大です (レベルの大きさにもよりますが、約 10 メガ)。
このように連載しています。
private void SerializeLevel()
{
string name = Globals.CurrentLevel.LvLSaveString;
using (Stream stream = new FileStream("SAVES\\"+name+".lvl", FileMode.Create, FileAccess.Write, FileShare.None))
{
formatter.Serialize(stream, Globals.CurrentLevel);
stream.Close();
}
}
私のゲーム エンジン アーキテクチャは、基本的にネストされたリストの負荷です。
Level\Room\Interior\Interiorthing\sprite
この階層は、ゲーム/パフォーマンスのために維持することが重要です。たとえば、通常、現在の部屋にあるものだけが更新と描画の対象となります。
シリアライゼーション/デシリアライゼーションのパフォーマンスを向上させるために、この投稿に示されている Raw Binary フォーマッターのようなものを試してみたい
物事のすべての位置/構成に対応するintとfloatとboolを保存し、レベルをロードするときにすべてを再インスタンス化できます(1秒しかかかりません)
私の質問は、このRaw Binaryシリアライザーをどのように使用するか、どのオブジェクトがどのタイプで、どのネストされたリストにあるかを維持する方法です。引用された例では、OPはintの巨大なリストをシリアル化し、3番目ごとに取得されます新しい座標の開始として。
各部屋のさまざまな種類のものごとに新しいストリームを作成できますが、その結果、さまざまなファイルがロードされることになります (私は思います)。生のバイナリ ストリームをある種の階層で分離する方法はありますか? すなわち。さまざまな部屋やさまざまなリストに関連するさまざまなセクションに分割しますか?
アップデート
わかりました、私を悩ませていたのは、OPが「手動シリアライゼーション」を「生のバイナリシリアライゼーション」と呼んでいるという問題で、情報が見つかりませんでした。