Ho lavorato a un'app WP7, è un'app per galleria di immagini, con zoom e gesti rapidi.Impossibile trovare la perdita di memoria
Per scopi di test, ho compilato l'app con immagini offline (i loro nomi file sono numerati) impostate su Contenuto e le ho consultate tramite una stringa codificata (che verrà sostituita in seguito).
Ma ci siamo resi conto che l'app consuma molta memoria. Ho pensato che fosse dovuto a immagini e trovato this blog; le immagini erano sempre in cache. Ho usato il codice dal blog per rettificare questo. La memoria non viene ancora rilasciata, sebbene la velocità di consumo sia diminuita.
Per il tentativo finale, ho creato un'altra app di test con il pulsante di funzionalità 2 di base per la navigazione e il controllo dell'immagine per le immagini, solo per accertarmi che non fossero i miei codici gestuali il problema.
Questo è il codice 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>
Questo è il file .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);
}
Ma ancora perdita di memoria è lì e non riesco a pin punto. Sto avendo difficoltà a trovarlo. Il profiler della memoria mostra che ho molte istanze di una stringa e non riesco a interpretarlo.
alcuni punti:
- Ho immagini di una cartella "000" e il nome di "immagine ###". Attualmente ho immagini con nomi di file da "image001" a "image042"
- L'app di test ha un footprint di memoria di 6 MB non appena mostra la prima pagina completamente con l'immagine, e dopo il primo cambio di pagina sale quasi a 18-20 MB
- successivamente risultato cambiamento pagina in aumento graduale della memoria e crash poi eventuale, se il numero di immagini permette, altrimenti dopo in bicicletta attraverso tutto il consumo di memoria immagini è costante
- sto usando file .jpg con ca. dimensione 1280 x 2000, per il test non sto ridimensionando le immagini.
Si sta generando un thread aggiuntivo per ogni immagine visualizzata per renderlo? Hai oggetti Thread 1918 in giro. Non sembra sano. Scopri come creare i thread e terminarli correttamente in modo che le risorse associate a cui fa riferimento il metodo thread possano essere rilasciate. –
@Alois, non sono un professionista, solo uno sviluppatore hobbista. Non ho idea di dove sto creando accidentalmente discussioni. Non sto creando alcun thread in modo esplicito. Non lo so nemmeno, è davvero un problema. Quello che posso dire che quello che stai vedendo è l'intero codice della mia app di esempio. Quindi, se potessi ricrearlo, dargli un'occhiata. Sarebbe utile. –