我的应用从here下载了六张图片,然后循环播放。我以GIF格式下载图片,使用.NET Image Tools将其转换为PNG格式,并将每个图片存储为BitmapImage
中的List<BitmapImage>
。
我用来将下载的图像添加到图像列表的代码是:
List<BitmapImage> images = new List<BitmapImage>();
//WebClient used for download
...
GifDecoder decoder = new GifDecoder();
ExtendedImage eim = new ExtendedImage();
decoder.Decode(eim, DOWNLOADEDIMAGESTREAM);
using (MemoryStream ms = new MemoryStream())
{
WriteableBitmap wbmp = eim.ToBitmap();
PngEncoder encoder = new PngEncoder();
encoder.Encode(eim, ms);
ms.Flush();
ms.Position = 0;
BitmapImage bmp = new BitmapImage();
bmp.SetSource(ms);
ms.Close();
images.Add(bmp);
}
e.Result.Dispose();
每个转换后的图像大约为10-20 KB,大小为600px x 550px。 (原始GIF的大小约为2/3。)
下载图像后,我的内存使用量约为80 MB。在不下载图像的情况下,内存使用量约为50 MB。 30 MB似乎用于存储六个图像的大量内存,总大小约为90 KB。此外,它会将我的帧速率降低到大约5或6,这会在用户缩放或移动图像时出现性能问题。 (我目前没有显示图像,只是将它们存储在内存中。我用来缩放和移动的图像是一个测试,并且在我的内存测量的两个期间都包含在内。)
我还想增加下载图片的大小,但是他们已经使用的内存量使这个不合理。
答案 0 :(得分:1)
忘掉压缩图像的大小。一旦你从它创建一个位图,它将是600x550x(3或4,可能,每像素字节)。所以你看每张图片超过1MB。在内存中,它们存储为未压缩的位图。这不占30MB,但如果您真的关心内存使用的细节,请使用SciTech的.NET Memory Profiler(试用版本http://memprofiler.com/),你可以确定在哪里记忆正在被占用。
我不隶属于SciTech。在过去的十年里,我曾经使用过几次探测器(包括我在一个项目中经常使用它的几年)。我发现它是确定.NET中如何使用内存的更准确方法之一。否则我发现经常错误的假设是很多猜测。
答案 1 :(得分:1)
从我的观点来看,我们可以在WP7上解决,因为移动设备的屏幕很小,我们无法显示图像的全部内容。我们可以下载而不是显示原始文件,我们应该减少宽度和高度正确的手机屏幕。只是我的两分钱。