1

私はマップの保存ファイルに取り組んでいます。基本的に、このマップの保存には、エンティティの位置や、この世界の各チャンクの画像 (ゲームプレイ中に変化する) などの情報が含まれます。これをすべて複数のファイルに保存することもできますが、単純にするために(ユーザーにとっては簡単です...)、また、マップを編集可能にしたくないので(二重だけでなく)、1つのファイルとして保持したいと思います少なくとも画像ファイルをクリックします)。

基本的には、ファイルへの書き込みに帰着します。現在、すべてが機能しています。世界の x 軸と y 軸に沿ったチャンクの数を示すために 2 バイトを書き込んでから、アルファ用に 1 バイトを格納します。各チャンクの各ピクセルの赤、緑、青。

各チャンクは 512 x 512 の画像です。ワールドを保存すると (チャンクとワールド サイズ (2 バイト) のみが含まれます。ファイル サイズは予想どおりです。チャンク数 * 512 * 512 * 4 (ARGB) + 2 (ワールド サイズ) バイト。

ただし、Bitmap.Save() でテスト エクスポートを行った各チャンクの画像のファイル サイズを見ると、各画像ファイルのサイズは 10 ~ 20 KB です。基本的に、はるかに少ないです。

そのため、複数の画像を 1 つのファイルに保存して、より現実的なスペースを占有する必要があります。

Bitmap.Save() が通常エクスポートするものを何らかの方法で取得し、それをファイルに追加するか、1 ピクセルあたり 4 バイトよりもスペースを節約して画像を手動で保存する方法を使用します。

誰かがそれらのいずれかへのアプローチを知っていますか? または、複数の画像を効果的に保存する別のアイデアはありますか?

4

1 に答える 1

7

BinaryFormatterを使用するのはどうですか?

したがって、保存するモデル データを表すクラスを設計します。

[Serializable]
public class MyModel
{
    public byte[][] Images { get; set; }
}

そして、このクラスのインスタンスがあると仮定します:

var model = new MyModel
{
    Images = new[]
    {
        File.ReadAllBytes(@"d:\work\image1.png"),
        File.ReadAllBytes(@"d:\work\image2.png"),
        File.ReadAllBytes(@"d:\work\image3.png"),
    }
};

ファイルにシリアル化できます:

var formatter = new BinaryFormatter();
using (var output = File.Create("images.dat"))
{
    formatter.Serialize(output, model);
}

もちろん、Bitmap のインスタンスがある場合は、それを対応するバイト配列に変換してモデル内に詰め込むだけです。

そして後でデータを読み返したいとき:

using (var input = File.OpenRead("images.dat"))
{
    var model = (MyModel)formatter.Deserialize(input);
}

もちろん、モデルは必要に応じて複雑にすることができます。さらに別のモデルを設計することで、名前、タイプなどのメタデータをこれらの画像に関連付けることができます。

于 2012-09-12T12:23:22.800 に答える