2

手続き的に生成されたレベルを使用して、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が「手動シリアライゼーション」を「生のバイナリシリアライゼーション」と呼んでいるという問題で、情報が見つかりませんでした。

4

1 に答える 1

1

の各メンバーをGlobals個別にシリアライズし、デシリアライズ時にメンバー値を手動で更新する場合は、デシリアライズ時に現在どのメンバーを処理しているかを知る必要があります。これらを提案できます:

  • アイテムを同じ順序で処理します。あなたの例のコードは、シリアル化された順序でメンバーを逆シリアル化しない限り、抽出するのがほぼ不可能なバイナリ データをストリームに入れます。新しいアイテムが追加された場合、これはメンテナンス地獄になり、コードの明確さ、保守性、および下位互換性の両方に関して良い解決策ではありません.

  • 辞書を使用します。 コメントによるGlobalsと、静的クラスのように見えるため、それ自体はシリアル化できません。シリアライズするときは、クラスのすべてのメンバーをGlobals辞書に入れてシリアライズします。逆シリアル化すると、辞書があることがわかります (オブジェクトのランダムな混乱ではありません)。Globals次に、逆シリアル化された辞書からオブジェクトを復元します

  • カスタムクラスを使用します。すべての設定でクラスを作成します (より良いアプローチ)。クラスの単一の静的インスタンスを使用して設定にアクセスします。そのクラスをシリアライズおよびデシリアライズできます

  • 設定2 番目のアプローチは、.NET に既に組み込まれている概念であるSettingsに近づきます 。それを見てください、Globalsクラスは実際には設定構成のカスタムバリアントであるようです

于 2013-05-15T13:57:09.683 に答える