我的应用程序从 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/