如何减少多个映像的内存使用

本文关键字:内存 映像 何减少 | 更新日期: 2023-09-27 18:10:58

我的应用程序从这里下载了六张图片,并循环播放它们。我以GIF格式下载图像,使用。net图像工具将它们转换为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- 20kb,大小为600px x 550px。(原始GIF的大小约为2/3)

下载图像后,我的内存使用量约为80 MB。没有下载图像,内存使用量约为50 MB。30 MB似乎用于存储六张图像的内存很多,总大小约为90 KB。此外,它将帧率降低到大约5或6,当用户缩放或移动图像时,这会导致性能问题。(我目前没有显示图像,只是将它们存储在内存中。我用来缩放和移动的图像是一个测试,并且在的内存测量期间包含。

我还想增加下载的图像的大小,但是它们已经使用的内存量使这变得不合理。

如何减少多个映像的内存使用

别管压缩图像有多大。一旦你从它创建一个位图,它将是600x550x(可能是3或4字节每像素)。因此,每个图像的存储空间超过1MB。在内存中,它们以未压缩的位图形式存储。这并不占30MB,但是如果你真的关心你的内存使用的细节,使用像SciTech的。net内存分析器(试用版在这里:http://memprofiler.com/),你可以找出内存被占用的确切位置。

我不隶属于科技公司。在过去的十年中,我使用过几次分析器(包括我在一个项目中经常使用它的几年时间)。我发现它是确定。net中如何使用内存的更准确的方法之一。否则,我发现这是大量的猜测和经常错误的假设。

从我的角度来看,我们可以在WP7上解决,因为手机屏幕很小,我们不能随心所欲地显示图像的全部内容。我们可以下载,但不是显示原始文件,我们应该减少宽度和高度正确的手机屏幕。