C# Texture2D.GetData方法的变通方法
我正在使用Monogame将游戏从XNA转换为iOS。C# Texture2D.GetData方法的变通方法,c#,ios,xna,textures,monogame,C#,Ios,Xna,Textures,Monogame,我正在使用Monogame将游戏从XNA转换为iOS。 在下面的代码片段中,smallDeform是一个Texture2D,我在其上调用GetData方法 smallDeform=Game.Content.Load(“地形/…”); GetData(smallDeformData,0,smallDeform.Width*smallDeform.Height); 我对Monogame有一些问题,因为iOS中的功能还没有实现,因为它返回这个异常 #如果是IOS 抛出新的NotImplemented
在下面的代码片段中,
smallDeform
是一个Texture2D
,我在其上调用GetData
方法
smallDeform=Game.Content.Load(“地形/…”);
GetData(smallDeformData,0,smallDeform.Width*smallDeform.Height);
我对Monogame有一些问题,因为iOS中的功能还没有实现,因为它返回这个异常
#如果是IOS
抛出新的NotImplementedException();
#艾利夫安卓
我尝试从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;
}
}
private void SaveTextureData(Texture2D纹理,字符串文件名)
{
int width=纹理宽度;
int height=纹理高度;
颜色[]数据=新颜色[宽度*高度];
GetData(data,0,data.Length);
使用(BinaryWriter=newBinaryWriter(File.Open(filename,FileMode.Create)))
{
writer.Write(宽度);
作者:写(高度);
writer.Write(数据长度);
for(int i=0;i
并加载数据
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;
}
}
private Texture2D LoadTextureData(字符串文件名)
{
使用(BinaryReader=newBinaryReader(File.Open(filename,FileMode.Open)))
{
var width=reader.ReadInt32();
var height=reader.ReadInt32();
var length=reader.ReadInt32();
var数据=新颜色[长度];
for(int i=0;i
二进制数据远小于XML数据。它是你在没有压缩的情况下所能得到的最小值。请注意,二进制格式在更改时非常严格。如果您需要更改格式,在大多数情况下写新文件会更容易
如果需要对方法进行更改,请注意保持同步。每次写入都应与完全相同顺序和数据类型的相同读取相匹配
我很想知道这些文件变小了多少。让我知道情况如何?如果有人有同样的问题,我会回答我自己的问题 按照craftworkgame的建议,我使用字节流保存数据,但由于缺少
文件
类,我不得不使用WinRT函数:
private async void SaveColorArray(string filename, Color[] array)
{
StorageFile sampleFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename + ".dat", CreationCollisionOption.ReplaceExisting);
IRandomAccessStream writeStream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream outputSteam = writeStream.GetOutputStreamAt(0);
DataWriter dataWriter = new DataWriter(outputSteam);
for (int i = 0; i < array.Length; i++)
{
dataWriter.WriteByte(array[i].R);
dataWriter.WriteByte(array[i].G);
dataWriter.WriteByte(array[i].B);
dataWriter.WriteByte(array[i].A);
}
await dataWriter.StoreAsync();
await outputSteam.FlushAsync();
}
protected async Task<Color[]> LoadColorArray(string filename)
{
StorageFile sampleFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename + ".dat", CreationCollisionOption.OpenIfExists);
IRandomAccessStream readStream = await sampleFile.OpenAsync(FileAccessMode.Read);
IInputStream inputSteam = readStream.GetInputStreamAt(0);
DataReader dataReader = new DataReader(inputSteam);
await dataReader.LoadAsync((uint)readStream.Size);
Color[] levelArray = new Color[dataReader.UnconsumedBufferLength / 4];
int i = 0;
while (dataReader.UnconsumedBufferLength > 0)
{
byte[] colorArray = new byte[4];
dataReader.ReadBytes(colorArray);
levelArray[i++] = new Color(colorArray[0], colorArray[1], colorArray[2], colorArray[3]);
}
return levelArray;
}
private async void SaveColorArray(字符串文件名,Color[]数组)
{
StorageFile sampleFile=等待Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(文件名+“.dat”,CreationCollisionOption.ReplaceExisting);
irandomaccesstream writeStream=await sampleFile.OpenAsync(FileAccessMode.ReadWrite);
IOOutputStream outputSteam=writeStream.GetOutputStreamAt(0);
DataWriter DataWriter=新的DataWriter(outputSteam);
for(int i=0;i0)
{
byte[]colorArray=新字节[4];
ReadBytes(colorArray);
levelArray[i++]=新颜色(colorArray[0],colorArray[1],colorArray[2],colorArray[3]);
}
返回级数组;
}
如果您愿意构建自己的MonoGame版本,您可以在iOS上使用Texture2D.GetData。请参见此处的修复:)
这是关于同一问题的讨论:
修复程序已被确认在iPad1 v5.1.1+和iPhone4 v6.1+上运行。Yap,这是我尝试过的另一种方式,但问题是,不幸的是,
File
类在Monogame中似乎不存在。我应该找到另一种保存文件的方法。我找到了另一种解决方案,但是+1需要您的帮助。我不明白,这里有一个texture.GetData调用,它没有在中实现