WPF性能

3

我将要构建一个简单的照片库应用程序,它会在列表框中显示图片。以下是XAML代码:

<ListBox x:Name="imageList" Margin="10,10" ItemsSource="{Binding}" Height="500">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" HorizontalAlignment="Left"></TextBlock>
                    <Image Source="{Binding}" Width="100" Height="100" HorizontalAlignment="Center"></Image>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

这里设置的DataContext是一个包含JPEG图像文件路径的字符串数组。
当我使用10-11张总大小为11MB的图片时,总内存使用量会上升到500MB!!!我非常惊讶,因为这只是一个简单的照片查看应用程序,什么都没做。运行这个应用程序使我的机器变得相当难用。
我正在使用VS 2010 Express,.NET 4和Vista。有人能解释一下后台发生了什么需要如此巨大的内存占用吗?还有什么可以优化的方法吗?
提前感谢。

背景中发生的事情可能与您发布的Xaml没有太大关系。您能否发布加载图像的代码? - Dan Puzey
当然。我有一个按钮,可以设置数据上下文。按钮点击时的代码如下:string[] files = Directory.GetFiles(@"C:\wpf_test"); this.DataContext = files;代码中没有其他内容。 - thewpfguy
2个回答

2

谢谢圣诞老人。我会看看转换器的。我已经检查了虚拟化,事实上,如果我减少列表框的高度,只显示两个图像,初始内存使用量为 144 MB,并且在每次向下滚动(显示下两个图像)时,内存增加了 40 MB。 - thewpfguy
1
谢谢。我刚刚尝试了DeocodePixelWidth,效果非常好。 - thewpfguy

1

不要忘记,当您加载压缩图像(JPEG可能非常压缩)时,一旦加载所需的内存几乎总是基于其未压缩状态。

因此,仅查看文件大小然后考虑内存可能会非常误导人 - 您应该查看图像像素大小 - 以长度x宽度x4作为粗略的经验法则开始 - 然后重新考虑内存使用是否如此过分。


非常感谢。我刚刚用比jpeg大两倍的.bmp文件进行了测试,结果令人惊讶。不仅图像加载速度快,而且UI(滚动)也更加响应。补充一下,我在WinForms中进行了相同的测试,结果也类似,所以这不是WPF的问题。-> 我想知道完整的照片库应用程序是如何做到的。 - thewpfguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接