Oppure

Loading
10/09/09 9:00
Il Totem
Sul piano teorico, comunque, anche il metodo usato da manvb.net non avrebbe molto senso. Di solito viene usato per aumentare la velocità di un pezzo di codice (variable enregistration) e non per diminuire il consumo di ram, tanto più che hai una variabile in più. E come se non bastasse, il tipo Image è un tipo reference. Ciò significa che anche facendo:
imgImm.BackgroundImage = My.Resources.Immagine

Entrambe le proprietà sottendono a variabili che puntano allo stesso oggetto (quindi non c'è nulla che si crea di nuovo). Quando quel codice viene usato per cambiare l'immagine, comunque c'è solo un cambiamento di indirizzo e gli oggetti esistenti rimangono sempre 4.

Questo a meno che il codice scritto dal compilatore crei una copia dell'immagine con Clone, ma non mi sembra che lo faccia (in quel caso ci sarebbero sempre nuove istanze per ogni richiesta).

Inoltre, ha ragione manvb.net: il GC impiega almeno due generazioni per distruggere effettivamente un oggetto, a causa del fenomeno di object resurrection, il che non semplifica le cose ad uno che vuol risparmiare memoria. Solo, ricordati sempre di usare Dispose per i tipi reference che occupano risorse esterne, e di impostare a Nothing tutti gli oggetti che non servono più. Per il resto affidati allo Spirito del Framework e spera che vada tutto bene.
aaa
10/09/09 9:04
manvb.net
Comunque sembrerebbe che caricando l'immagine da resources il compilatore crei una nuova istanza e non sia un semplice passaggio di reference, altrimenti i 200kb in più ad ogni assegnamento non si spiegerebbero!
Credo che il vb.net non salvi nei resources l'istanza pronta, ma il file immagine così com'è, per questo verrebbe creata ogni volta una nuova istanza che va ad occupare memoria!
Ultima modifica effettuata da manvb.net 10/09/09 9:09
aaa
11/09/09 11:40
Il Totem
No, la proprietà è di tipo Bitmap. E' il codice della proprietà, similmente a quanto avevo detto io su clone:
Dim obj As Object = ResourceManager.GetObject("immagine", resourceCulture)
Return CType(obj,System.Drawing.Bitmap)

Devi modificare il codice della classe MyResources, usando l'istanziamento differito: crei delle variabili locali che inizializzi solo la prima volta che ne viene richiesto il valore (modificando il codice scritto nelle proprietà;). Es.:
Private _Img As Bitmap

Friend ReadOnly Property Img() As System.Drawing.Bitmap
    Get
        If _Img Is Nothing Then
            Dim obj As Object = ResourceManager.GetObject("BlueSocket", resourceCulture)
            _Img = CType(obj, System.Drawing.Bitmap)
        End If
        Return _Img
    End Get
End Property
aaa
12/09/09 20:55
dedalux
Beh io ho notato che creando 4 variabili ed assegnando loro le immagini come mi aveva consigliato manvb.net è servito a far risparmiare ram, però il fenomeno rimane, anche se in forma decisamente ridotta, secondo te otem che dovrei fare?
Ultima modifica effettuata da dedalux 12/09/09 23:30
aaa
13/09/09 7:59
Il Totem
Sei sicuro che la memoria venga usata proprio per le immagini?

Btw, FTA!
aaa
13/09/09 10:25
dedalux
Penso di si, perche in taskmanager la vedo salire solo quando sposto il cursore dentro e fuori al pulsante, basta quello x farla salire. Poi cmq succede la stessa cosa impostando su .Visible = True/False un oggetto componente della form...
aaa