为什么从独立存储获取图像而不是从程序集中嵌入图像时,列表框会消耗如此多的内存

本文关键字:图像 列表 内存 获取 存储 独立 为什么 集中 程序集 程序 | 更新日期: 2023-09-27 18:19:55

我在Windows Phone Mango中创建了一个列表框。

我将使用它在一个长列表中显示许多照片。

出于测试目的,我只是使用一张照片,并为每个索引重复它。

从独立存储加载映像时,100个映像会消耗170MB的内存。

当我在程序集中嵌入相同的图像作为资源(ie/Images/image1.jpg)时,10’000个图像只消耗40MB。事实上,它从未超过40MB,无论这里发生了什么(UI虚拟化?),它都能很好地工作。

我的图像必须使用独立存储,因为图像更新会定期下载到手机上。我能让它像嵌入图像一样执行吗?

有人能给我解释一下吗;

  1. 当我从隔离存储中获取映像时,为什么它占用了这么多内存,我加载的越多,它就越高?

  2. 当我从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语句中,则应该释放内存。

希望得到帮助。