c# - 如何减少多个图像的内存使用?

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

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

最佳答案

忘记压缩图像有多大。一旦你用它创建了一个位图,它的大小将是 600x550x(可能是每像素 3 或 4 字节)。因此,您查看的每张图像都超过 1MB。在内存中它们存储为未压缩的位图。这并不占 30MB,但如果您确实关心内存使用的详细信息,请使用 SciTech 的 .NET Memory Profiler(可在此处试用:http://memprofiler.com/),您可以确定内存在哪里正在处理中。

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

关于c# - 如何减少多个图像的内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221673/

相关文章:

c# - Visual Studio 2010 专业版 : class diagram tool

c# - C# 中的日期时间格式

wpf - 多选 WPF 列表框通过单击进行多项选择

c# - 不再为集合返回 ObservableCollection

c# - 从免费/专业版到应用内购买

c# - 如何在 Silverlight 中将多个超链接按钮放在一行中?

c# - 新的 `System.Text.Json` 是否有必需的 property 属性?

javascript - 如何使用 JavaScript 将两个文本框相乘并显示结果

silverlight - Silverlight 是否有内置的内存中 LRU 缓存?

c# - 单击 WP7 时列表框项目更改