私はWP7アプリに取り組んでいます。これは、基本的なズームとフリックジェスチャが実装された画像ギャラリーアプリです。
テストの目的で、オフライン画像(ファイル名には番号が付けられています)をContentに設定してアプリをコンパイルし、ハードコードされた文字列(後で置き換えられます)を介してアクセスしました。
しかし、アプリが大量のメモリを消費することに気づきました。画像によるものだと思い、このブログを見つけました; 画像は常にキャッシュされていました。これを修正するためにブログのコードを使用しました。それでも、消費率は低下しましたが、メモリは解放されません。
最後の試みとして、ナビゲーション用の基本機能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〜20MBになります。
- その後のページ変更により、メモリが徐々に増加し、画像の数が許せば最終的にクラッシュします。それ以外の場合は、すべての画像を循環した後、メモリ消費量は一定です。
- 約1280x2000のサイズの.jpgファイルを使用していますが、テスト用に画像のサイズを変更していません。