为什么从独立存储获取图像而不是从程序集中嵌入图像时,列表框会消耗如此多的内存
本文关键字:图像 列表 内存 获取 存储 独立 为什么 集中 程序集 程序 | 更新日期: 2023-09-27 18:19:55
我在Windows Phone Mango中创建了一个列表框。
我将使用它在一个长列表中显示许多照片。
出于测试目的,我只是使用一张照片,并为每个索引重复它。
从独立存储加载映像时,100个映像会消耗170MB的内存。
当我在程序集中嵌入相同的图像作为资源(ie/Images/image1.jpg)时,10’000个图像只消耗40MB。事实上,它从未超过40MB,无论这里发生了什么(UI虚拟化?),它都能很好地工作。
我的图像必须使用独立存储,因为图像更新会定期下载到手机上。我能让它像嵌入图像一样执行吗?
有人能给我解释一下吗;
-
当我从隔离存储中获取映像时,为什么它占用了这么多内存,我加载的越多,它就越高?
-
当我从images文件夹中获取它时,当它是程序集的一部分时,它怎么能加载数万个映像,而内存永远不会增加,这是UI虚拟化吗?
感谢您提前提供的帮助。
这是我的密码。(6个月前才开始开发,如果它看起来有点不可靠的话!)
//从隔离存储获取图像
IsolatedStorageFile insISF = IsolatedStorageFile.GetUserStoreForApplication();
for (int i = 0; i < 100; i++)
{
byte[] byte1;
using (IsolatedStorageFileStream isfs = insISF.OpenFile("''Photos''image1.jpg", FileMode.Open, FileAccess.Read))
{
byte1 = new byte[isfs.Length];
isfs.Read(byte1, 0, byte1.Length);
isfs.Close();
}
Image image = new Image();
MemoryStream ms = new MemoryStream(byte1);
BitmapImage bi = new BitmapImage();
bi.SetSource(ms);
image.Source = bi;
listBox2.Items.Add(image);
//NOTE I HAVE TRIED "ms.Dispose();" HERE BUT IT DOES NOT HELP.
}
//结束
//从IMAGES文件夹中获取图像作为汇编的一部分
for (int i = 0; i < 10000; i++)
{
BitmapImage bi = new BitmapImage(new Uri("/Images/image1.jpg", UriKind.Relative));
Image image = new Image();
image.Source = bi;
listBox2.Items.Add(image);
}
//结束
从Isolated Storage
加载图像时,将逐字节加载,即所有图像都已完全加载。
相反,当您创建BitmapImage
时,默认情况下会使用DelayCreation
选项。所以,应用程序现在只加载了屏幕上的图像。有关更多详细信息,请参阅CreateOption
枚举。
Mango 上图像的离线解码
它可能是IsolatedStorageFileStream和MemoryStream对象吗???
尝试使用GC来监视for循环中每个迭代的内存使用情况。
在任何一种情况下,列表框上的虚拟化都应该是相同的。
顺便说一句,您也应该在MemoryStream上使用using构造。
在代码中,字节数组由垃圾回收器处理,一旦超出范围,垃圾回收器就应该显式处理的对象只有可以包含在using
语句中的对象。。。
我从未尝试过,但我认为如果您直接从流中读取图像,而不是从流中读图像,将其写入数组并从数组中重新读取,和将流包含在using
语句中,则应该释放内存。
希望得到帮助。