none
Come cancellare dalla RAM le risorse usate da controlli image RRS feed

  • Domanda

  • Salve a tutti,

    Ho questo codice:

                byte selItem = (byte)this.cmbRageType.SelectedIndex;
                List<string> Images = new List<string>();
                //Images = RageEnvironment.Rages[selItem];
                this.ungImages.Children.Clear();
                for (int i = 0; i < ImageList.Count; i++)
                {
                    ImageList[i] = null;
                }
                ImageList.Clear();
                System.GC.Collect();
    #warning "Rimuovi blocco if"
                if (selItem != 28)
                {
                    Images = RageEnvironment.Rages[selItem];
                    foreach (string s in Images)
                    {
                        Image Im = new Image();
                        Im.Source = new BitmapImage(new Uri(@"pack://application:,,,/Rages/" + RageEnvironment.RageDirectories[selItem] + "/" + s));
                        Im.Stretch = Stretch.Fill;
                        Im.Width = 128;
                        Im.Height = 128;
                        ImageList.Add(Im);
                    }
                    foreach (Image i in ImageList)
                        this.ungImages.Children.Add(i);
                }

    Che prende i percorsi di molte immagini aggiunte al mio progetto da una lista precedetemente creata con un file di testo e crea in uno stackpanel le thumbnail delle immagini usando dei controlli image. Queste immagini sono suddivise per directory che specificano l'appartenenza ad un certo gruppo (ad esempio: le immagini che rappresentano uno smile felice andranno nella cartella 'Happy' eccetera). Io creo le immagini in una lista (inizialmente la soluzione era di crearle e poi di aggiungerle subito al children dello stackpanel) e poi itero nella lista aggiungendo le immagini.

    Il punto è che così il consumo di RAM è elevato rispetto alle immagini caricate. Ad esempio: la directory 'Happy' contiene 400KB di immagini totali, ma se la carico in RAM (usando una combobox posso scegliere la categoria) , il consumo totale è di 5,1MB in più. E questo non diminuisce caricando un'altra categoria, almeno non subito. Ad esempio: se il consumo totale del programma è di 45MB (perché ho caricato parecchie categorie) se carico un altra categoria potrebbe salire o scendere drasticamente. Il massimo cui sono arrivato è 58MB. Il punto è che questo calo si verifica casualmente, di qualche MB e immediato se scelgo un'altra categoria, di qualche centinaio di KB e lento (è sceso di 1MB in due minuti) se non faccio nulla.

    Per questo ho provato ad usare il metodo della lista di immagini che vedete sopra: quando cambio categoria le ex-immagini vengono settate a null e poi ne carico delle altre, ma il consumo di RAM è sempre quello che ho descritto qui. Non sembra esserci un apparente collegamento tra il peso totale delle immagini da caricare e l'aumento del consumo di RAM del programma.

    Per adesso non ci sono problemi, poiché 58MB di RAM sono retti da qualunque sistema, il problema sarà quando aggiungerò molti controlli image in un canvas per creare una sorta di "fumetto".

    Come posso fare per ridurre il consumo di RAM da parte del programma? Ho anche provato (come potete vedere) a forzare il Garbage Collector a liberare le risorse, ma senza successo...

    Qualcuno ha una soluzione?

    Grazie mille!

    Jymmy097

    mercoledì 21 agosto 2013 19:32