如何减少多个映像的内存使用
本文关键字:内存 映像 何减少 | 更新日期: 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上解决,因为手机屏幕很小,我们不能随心所欲地显示图像的全部内容。我们可以下载,但不是显示原始文件,我们应该减少宽度和高度正确的手机屏幕。