Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Texture2D.GetData方法的变通方法_C#_Ios_Xna_Textures_Monogame - Fatal编程技术网

C# Texture2D.GetData方法的变通方法

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

我正在使用Monogame将游戏从XNA转换为iOS。
在下面的代码片段中,
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调用,它没有在中实现