すべてのプレーヤー サーバー側のデータをシリアル化し、サイズは約 128kb です。マッピングに必須の [255,255] ブール配列をシリアル化します。
protobuf-net について聞いたことがありますが、文書化されておらず、インターネット上に例がありません。
すべてのプレーヤー サーバー側のデータをシリアル化し、サイズは約 128kb です。マッピングに必須の [255,255] ブール配列をシリアル化します。
protobuf-net について聞いたことがありますが、文書化されておらず、インターネット上に例がありません。
私が最初にすることは、そのデータを a に保存しないことです。これbool[,]
はかなり非効率的であり、保存するのは本当に面倒です。それをフラットにシムするラッパーを書きますbyte[]
:
public sealed class BitGrid
{
public BitGrid() {
// 255 * 255 = 32 bytes per row, 255 rows
bytes = new byte[8160];
}
public BitGrid(byte[] data)
{
if (data == null) throw new ArgumentNullException("data");
if (data.Length != 8160) throw new ArgumentException("data");
this.bytes = data;
}
readonly byte[] bytes;
public bool this[byte x, byte y]
{
get
{
int xByte = x / 8, xBit = x % 8;
byte val = bytes[(32 * y) + xByte];
switch (xBit)
{
case 0: return (val & 1) != 0;
case 1: return (val & 2) != 0;
case 2: return (val & 4) != 0;
case 3: return (val & 8) != 0;
case 4: return (val & 16) != 0;
case 5: return (val & 32) != 0;
case 6: return (val & 64) != 0;
case 7: return (val & 128) != 0;
}
throw new InvalidOperationException("oops!");
}
set
{
int xByte = x / 8, xBit = x % 8;
int offset = (32 * y) + xByte;
byte val = bytes[offset];
if (value)
{
switch (xBit)
{
case 0: val |= 1; break;
case 1: val |= 2; break;
case 2: val |= 4; break;
case 3: val |= 8; break;
case 4: val |= 16; break;
case 5: val |= 32; break;
case 6: val |= 64; break;
case 7: val |= 128; break;
}
}
else
{
switch (xBit)
{
case 0: val &= 254; break;
case 1: val &= 253; break;
case 2: val &= 251; break;
case 3: val &= 247; break;
case 4: val &= 239; break;
case 5: val &= 223; break;
case 6: val &= 191; break;
case 7: val &= 127; break;
}
}
bytes[offset] = val;
}
}
public byte[] ToArray()
{
return (byte[])bytes.Clone();
}
}
それをシリアル化するには、次のようにします。
byte[] data = grid.ToArray();
// store "data"
逆シリアル化するには、次のようにします。
byte[] data = ...
grid = new BitGrid(data);
/メソッドbyte[]
を使用してディスクに保存/ディスクからロードできます。または、保存する他のデータがある場合は、標準のシリアライザーは. このデータは常に 8160 バイト (8k のすぐ下) になります。File.ReadAllBytes
File.WriteAllBytes
byte[]
ブール値をビットとして表し、バイナリとしてシリアル化すると、約 8 キロバイトしかありません。
テキストとして必要な場合は、base64 を使用してバイナリをシリアル化します。これにより、約 12 キロバイトになります。
2 次元配列を 1 次元配列にフラット化し、BitArray
それから を作成します。
例:
bool[] bools = { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true };
BitArray bits = new BitArray(bools);
byte[] bytes = new byte[3];
bits.CopyTo(bytes, 0);
Console.WriteLine(BitConverter.ToString(bytes));
Console.WriteLine(Convert.ToBase64String(bytes));
出力:
FF-FF-0F
//8P
シリアル化に (1 次元) BitArrayを使用できます。これにより、ビットがバイトにパックされます。