序列化数据实际上是一个非常聪明的解决方法,但 XML 对于这项工作来说太繁重了。我要做的是使用定制但简单的二进制格式,以便您可以控制输出的大小。
以下是我提出的几种应该可行的方法,但请注意,我专门制作它们是为了回答这个问题,并且它们尚未经过测试。
保存数据..
private void SaveTextureData(Texture2D texture, string filename)
{
int width = texture.Width;
int height = texture.Height;
Color[] data = new Color[width * height];
texture.GetData<Color>(data, 0, data.Length);
using (BinaryWriter writer = new BinaryWriter(File.Open(filename, FileMode.Create)))
{
writer.Write(width);
writer.Write(height);
writer.Write(data.Length);
for (int i = 0; i < data.Length; i++)
{
writer.Write(data[i].R);
writer.Write(data[i].G);
writer.Write(data[i].B);
writer.Write(data[i].A);
}
}
}
并加载数据..
private Texture2D LoadTextureData(string filename)
{
using (BinaryReader reader = new BinaryReader(File.Open(filename, FileMode.Open)))
{
var width = reader.ReadInt32();
var height = reader.ReadInt32();
var length = reader.ReadInt32();
var data = new Color[length];
for (int i = 0; i < data.Length; i++)
{
var r = reader.ReadByte();
var g = reader.ReadByte();
var b = reader.ReadByte();
var a = reader.ReadByte();
data[i] = new Color(r, g, b, a);
}
var texture = new Texture2D(GraphicsDevice, width, height);
texture.SetData<Color>(data, 0, data.Length);
return texture;
}
}
二进制数据远小于 XML 数据。它与没有压缩的情况下一样小。请注意,二进制格式在更改时非常严格。如果您需要更改格式,在大多数情况下写出新文件会更容易。
如果您需要对方法进行更改,请注意使它们保持同步。每个 Write 都应该以完全相同的顺序和数据类型与相同的 Read 匹配。
我很想知道文件变小了多少。告诉我进展如何?