我发现与方法奇怪的问题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的正常工作,这个问题。
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);
在获取纹理数据解决问题的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;
}
有一点需要注意,从存储加载纹理时你应该知道保存质地的准确尺寸,并把它作为负载功能参数。 这可以很容易地修改,但我不需要。