gpt4 book ai didi

c# - Texture2D.GetData 方法的解决方法

转载 作者:可可西里 更新时间:2023-11-01 03:57:03 24 4
gpt4 key购买 nike

我正在使用 Monogame 将一款游戏从 XNA 转换到 iOS。
在下面的代码片段中,smallDeform 是一个 Texture2D,我在其上调用了 GetData 方法。

smallDeform = Game.Content.Load<Texture2D>("Terrain/...");
smallDeform.GetData(smallDeformData, 0, smallDeform.Width * smallDeform.Height);

我在使用 Monogame 时遇到一些问题,因为 iOS 中的该功能尚未实现,因为它会返回此异常。

#if IOS 
throw new NotImplementedException();
#elif ANDROID

我尝试从 Windows 序列化 XML 文件中的数据以从 iOS 加载整个文件。序列化后的文件每个都超过 100MB,无法解析。

基本上,我正在寻找一种解决方法来从纹理中获取数据(例如 uint[]Color[])而不使用 GetData 方法。

PS:我在 Mac 上,所以我不能使用 Monogame SharpDX 库。

提前致谢。

最佳答案

序列化数据实际上是一个非常聪明的解决方法,但 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 匹配。

我很想知道文件变小了多少。告诉我进展如何?

关于c# - Texture2D.GetData 方法的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com