Texture2d.SaveAsPng()内存泄漏(Texture2d.SaveAsPng() Me

2019-10-18 18:18发布

我发现与方法奇怪的问题Texture2d.SaveAsPng()每次调用1.5MB disapear。 我用这个方法来保存纹理独立存储

public static void SaveTextureToISF(string fileName, Texture2D texture)
        {
            using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (
                    IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, FileMode.Create, file)
                    )
                {
                    texture.SaveAsPng(fileStream, texture.Width, texture.Height);
                    fileStream.Close();
                }
            }
        }

我需要保存大量的纹理和我有严重的内存泄露。 在Windows Phone 8个设备都只能在Windows Phone 7的正常工作,这个问题。

Answer 1:

Texture2D.SaveAsPng()具有已知的内存泄漏。 我注意到这个问题相当长一段时间后发现它的解决方案。 唯一的解决办法是创建自己的纹理节能程序。

public static void Save(this Texture2D texture, int width, int height, ImageFormat    imageFormat, string filename)
{
    using (Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb))
    {
        byte blue;
        IntPtr safePtr;
        BitmapData bitmapData;
        Rectangle rect = new Rectangle(0, 0, width, height);
        byte[] textureData = new byte[4 * width * height];

        texture.GetData<byte>(textureData);
        for (int i = 0; i < textureData.Length; i += 4)
        {
            blue = textureData[i];
            textureData[i] = textureData[i + 2];
            textureData[i + 2] = blue;
        }
        bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
        safePtr = bitmapData.Scan0;
        Marshal.Copy(textureData, 0, safePtr, textureData.Length);
        bitmap.UnlockBits(bitmapData);
        bitmap.Save(filename, imageFormat);
    }
}

然后,你可以调用的(前提是你把它作为一个扩展方法) texture.SaveAs(texture.Width, texture.Height, ImageFormat.Png, fileName);



Answer 2:

在获取纹理数据解决问题的byte数组,并保存到独立存储

public static void SaveTextureToISF(string fileName, Texture2D texture)
{
    byte[] textureData = new byte[4 * texture.Width * texture.Height];
    texture.GetData(textureData);
    Save(fileName, textureData); //saving array to IS
}

并且需要纹理时,负载byte从存储阵列,该数据加载到新的纹理。

 public static Texture2D LoadTextureFromISF(string fileName, int width, int height)
 {
     Texture2D texture = new Texture2D(GraphicsDevice, width, height);
     byte[] textureData = Load(fileName); //load array from IS
     texture.SetData(textureData);
     return texture;
 }

有一点需要注意,从存储加载纹理时你应该知道保存质地的准确尺寸,并把它作为负载功能参数。 这可以很容易地修改,但我不需要。



文章来源: Texture2d.SaveAsPng() Memory Leak