2

我的应用程序从这里下载了六张图片并循环播放。我以 GIF 格式下载图像,使用.NET Image Tools将它们转换为 PNG 格式,并将每个图像存储BitmapImageList<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 用于存储 6 张图像的内存似乎很大,总大小约为 90 KB。此外,它会将我的帧速率降低到大约 5 或 6,这会在用户缩放或移动我的图像时导致性能问题。(我目前没有显示图像,只是将它们存储在内存中。我用来缩放和移动的图像是一个测试,在我的两次内存测量中都包含在内。)

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

4

2 回答 2

1

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

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

于 2013-04-25T18:17:04.480 回答
1

在我看来,我们可以在 WP7 上解决,因为手机屏幕很小,我们无法按照我们的意愿显示图像的全部内容。我们可以下载,但不要显示原始文件,我们应该减少与手机屏幕正确的宽度和高度。只是我的两分钱。

于 2013-04-25T18:22:30.620 回答