我一直在开发一个WP7应用,它是一个图库应用程序,基本的缩放和滑动手势已经实现。
为了测试目的,我将应用程序编译为离线图像(它们的文件名是有编号的),并通过硬编码字符串来访问它们(稍后将被替换)。
但是我发现应用程序消耗了很多内存。我以为这是由于图片,找到了这篇博客,图片一直在缓存。我使用了博客中的代码来纠正这个问题。尽管消耗速度有所降低,但仍然没有释放内存。
为了最后的尝试,我创建了另一个测试应用程序,它具有基本功能:2个用于导航的按钮和控制图像的图像控件,只是为了确保它不是我的手势代码可能出现的问题。
这是xaml。
为了测试目的,我将应用程序编译为离线图像(它们的文件名是有编号的),并通过硬编码字符串来访问它们(稍后将被替换)。
但是我发现应用程序消耗了很多内存。我以为这是由于图片,找到了这篇博客,图片一直在缓存。我使用了博客中的代码来纠正这个问题。尽管消耗速度有所降低,但仍然没有释放内存。
为了最后的尝试,我创建了另一个测试应用程序,它具有基本功能:2个用于导航的按钮和控制图像的图像控件,只是为了确保它不是我的手势代码可能出现的问题。
这是xaml。
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Image Grid.Row="0" x:Name="ImageHolder" Height="Auto" Width="Auto" Stretch="Uniform" Tap="image_Tap" />
<TextBlock x:Name="MemUsage" />
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button x:Name="PrevButton" Content="Prev" Width="240" Click="btnPrev_Click"/>
<Button x:Name="NextButton" Content="Next" Width="240" Click="btnNext_Click"/>
</StackPanel>
</Grid>
这是一个 .cs 文件。
const int PAGE_COUNT = 42;
int pageNum = 0;
public MainPage()
{
InitializeComponent();
RefreshImage();
}
private void btnPrev_Click(object sender, RoutedEventArgs e)
{
pageNum = (PAGE_COUNT + pageNum - 1) % PAGE_COUNT; // cycle to prev image
RefreshImage();
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
pageNum = (PAGE_COUNT + pageNum + 1) % PAGE_COUNT; // cycle to next image
RefreshImage();
}
private void image_Tap(object sender, GestureEventArgs e)
{
RefreshTextData();
}
private void RefreshImage()
{
BitmapImage image = ImageHolder.Source as BitmapImage;
ImageHolder.Source = null;
if (image != null)
{
image.UriSource = null;
image = null;
}
ImageHolder.Source = new BitmapImage(new Uri("000\\image" + (pageNum + 1).ToString("D3") + ".jpg", UriKind.Relative));
RefreshTextData();
}
private void RefreshTextData()
{
MemUsage.Text = "Device Total Memory = " + (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory") / (1024 * 1024)
+ "\nCurrent Memory Usage = " + (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage") / (1024 * 1024)
+ "\nPeak Memory Usage = " + (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage") / (1024 * 1024);
}
但是仍然存在内存泄漏,我无法确定问题出在哪里。我很难找到它。内存分析器显示我有许多字符串实例,我无法理解。
几个要点:
- 我有一个名为“000”的文件夹中的图像,并以“image###”命名。目前,我的图像文件名从“image001”到“image042”
- 测试应用程序在完全显示第一页和图像后立即具有6 MB的内存占用量,而在第一页更改后,它会增加到将近18-20 MB
- 随后的页面更改会导致内存逐渐增加,然后最终崩溃(如果图像数量允许),否则在循环所有图像后,内存消耗保持不变
- 我正在使用大约尺寸为1280 x 2000的 .jpg 文件进行测试,对于测试,我没有调整图像大小。