如何减少多个图像的内存使用量?

时间:2013-04-25 18:05:30

标签: c# silverlight windows-phone-7 memory bitmapimage

我的应用从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,这会在用户缩放或移动图像时出现性能问题。 (我目前没有显示图像,只是将它们存储在内存中。我用来缩放和移动的图像是一个测试,并且在我的内存测量的两个期间都包含在内。)

我还想增加下载图片的大小,但是他们已经使用的内存量使这个不合理。

2 个答案:

答案 0 :(得分:1)

忘掉压缩图像的大小。一旦你从它创建一个位图,它将是600x550x(3或4,可能,每像素字节)。所以你看每张图片超过1MB。在内存中,它们存储为未压缩的位图。这不占30MB,但如果您真的关心内存使用的细节,请使用SciTech的.NET Memory Profiler(试用版本http://memprofiler.com/),你可以确定在哪里记忆正在被占用。

我不隶属于SciTech。在过去的十年里,我曾经使用过几次探测器(包括我在一个项目中经常使用它的几年)。我发现它是确定.NET中如何使用内存的更准确方法之一。否则我发现经常错误的假设是很多猜测。

答案 1 :(得分:1)

从我的观点来看,我们可以在WP7上解决,因为移动设备的屏幕很小,我们无法显示图像的全部内容。我们可以下载而不是显示原始文件,我们应该减少宽度和高度正确的手机屏幕。只是我的两分钱。