Domanda

Il mio sito web è interamente basato su Flash, si muove attorno a un modello 3D che mi è stato fornito sotto forma di blocchi di video che ho convertito in file FLV.Utilizzo il componente FLVPlayback per controllare il video all'interno del mio programma.Durante l'esecuzione dei controlli di memoria utilizzando System.totalMemory ho notato che ogni volta che viene caricato un video, consumerà una parte di memoria e anche quando rimuovo tutti gli ascoltatori di eventi da esso (sono tutti debolmente referenziati), rimuovo il componente da il suo genitore, interrompe il video e annulla l'istanza del componente, non restituirà comunque quella memoria.

Questo mi ha infastidito da quando ho iniziato a lavorare su questo progetto a causa dell'enorme quantità di video che un utente può potenzialmente istanziare e caricare.Attualmente ogni video viene caricato in una nuova istanza FLVPlayback ogni volta che è richiesto, ma ho letto che forse il modo migliore per risolvere questo problema è semplicemente avere un'istanza FLVPlayback globale e ricaricare semplicemente il nuovo video nella vecchia istanza, in questo modo ci sarebbe solo un componente FLVPlayback nella memoria dell'applicazione.

Anche qualcun altro ha riscontrato questo problema?Hai trovato una soluzione migliore rispetto all'utilizzo di un'istanza globale che riutilizzi per ogni nuovo video?

È stato utile?

Soluzione

Sfortunatamente, non puoi aiutare molto i problemi di memoria finché Flash non aggiunge i distruttori e l'eliminazione esplicita degli oggetti.Vedi questo thread:

Scaricamento di un ByteArray in Actionscript 3

Esiste un limite alla quantità di memoria che le applet Flash possono utilizzare;il GC sembra attivarsi al raggiungimento di tale limite.Ho visto che le mie applet di facile utilizzo utilizzano fino a ~ 200 MB, solo perché funzionano per ore e il GC non vuole avviarsi.

Oh, e non penso nemmeno che usare una singola istanza sia una soluzione elegante.Attualmente scrivo solo una funzione Dispose() per le mie classi personalizzate, in attesa che un giorno possa essere trasformata in un vero e proprio distruttore.

Altri suggerimenti

Non mi sono mai piaciuti molto i componenti, sono un po' confusi.Questo particolare problema sembra essere comune e la soluzione un po' fastidiosa è, come suggerisci, avere un solo FLVPlayback e riutilizzarlo.

Ecco un post sul blog a riguardo

Grazie per le risposte, anche i collegamenti alle altre domande del blog sono stati utili, avevo letto anche tutte le informazioni di Grant Skinner sulla raccolta dei rifiuti, ma cercare tra quei collegamenti e tornare indietro e rileggere ciò che aveva originariamente detto su GC mi ha aiutato rinfrescare la vecchia zucca.Oltre ad annullare e istanziare nuovamente quel singolo componente FLVPlayback, mi sono anche reso conto che non stavo scaricando e distruggendo correttamente nemmeno le mie istanze di Loader, quindi le ho ripulite e ora il programma funziona in modo molto più efficiente.Direi che l'utilizzo della memoria è migliorato di circa il 90% per il sito.

@aib Ammetto che la soluzione a istanza singola non è elegante, ma poiché Flash non lascia andare quei file FLV, sono bloccato.

@grapefrukt Detesto i componenti Flash, in genere causano più problemi che tempo risparmiato, tuttavia in questo caso avevo molti cue point e cose di navigazione in corso con i file video e il componente FLVPlayback è stata la soluzione migliore che ho trovato.Ovviamente sono ancora abbastanza nuovo nel mondo di ActionScript, quindi forse ho trascurato qualcosa

Vorrei anche avere la reputazione di votare entrambe le tue risposte perché sono state entrambe utili ...è la vita

Da quello che ho capito dopo molti test è che Flash si carica dinamicamente nelle librerie e nei componenti secondo necessità, ma i dati non vengono mai raccolti in modo spazzatura.Ad esempio, se ho un sito Web o un'app Air che utilizza il componente FLVPlayback, il componente effettivo e le librerie ad esso associate non vengono caricati finché non viene creata una nuova istanza FLVPlayback().Verrà quindi caricato nella libreria e nel componente in memoria, ma non recupererai mai quello spazio finché il programma/sito web non verrà chiuso.Quella specifica istanza con il video al suo interno verrà raccolta dei rifiuti e rilascerà un po' di memoria fintanto che rimuovi gli ascoltatori da essa, la togli dal palco e la imposti su null.

Inoltre, se stai realizzando video singoli, il VideoPlayer è molto più leggero e si pulisce meglio.

Sfortunatamente, questo è proprio il modo in cui Flash gestisce la situazione.Non particolarmente intelligente, ma funziona per la maggior parte delle persone.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top