Aquí podría ser tu PUBLICIDAD


Descargando un ByteArray usando Actionscript 3

votos
72

¿Cómo puedo descargar a la fuerza ByteArrayde la memoria con ActionScript 3?

He probado lo siguiente:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
Publicado el 01/08/2008 a las 13:30
fuente por usuario maclema
En otros idiomas...        العربية       

8 respuestas

votos
29

No creo que tengas nada de qué preocuparte. Si System.totalMemoryse cae puede relajarse. Es muy posible que el sistema operativo no reclame la memoria recién liberada (en previsión de la próxima vez que Flash Player solicite más memoria).

Intente hacer otra cosa que requiera mucha memoria y estoy seguro de que notará que la memoria asignada a Flash Player disminuirá y se utilizará para el otro proceso.

Tal como lo he entendido, la administración de la memoria en los sistemas operativos modernos no es intuitiva desde la perspectiva de observar los montos asignados a cada proceso, o incluso la cantidad total asignada.

Cuando uso mi Mac por 5 minutos, se usa el 95% de mis 3 GB de RAM, y seguirá siendo así, nunca baja. Así es como el sistema operativo maneja la memoria.

Mientras no sea necesario en otros lugares, incluso los procesos que se han cerrado todavía tienen memoria asignada a ellos (esto puede hacer que se lancen más rápido la próxima vez, por ejemplo).

Respondida el 14/08/2008 a las 06:05
fuente por usuario Theo


Aquí podría ser tu PUBLICIDAD


votos
19

(No estoy seguro de esto, pero ...)

AS3 usa una recolección de basura no determinista. Lo que significa que la memoria sin referencia se liberará siempre que el tiempo de ejecución lo parezca (normalmente no, a menos que exista una razón para ejecutarla, ya que es una operación costosa de ejecutar). Este es el mismo enfoque utilizado por la mayoría de los lenguajes modernos recogidos de basura (como C # y Java también).

Suponiendo que no hay otras referencias a la memoria apuntada por byteArrayo los elementos dentro de la matriz en sí, la memoria se liberará en algún momento después de salir del alcance donde byteArrayse declara.

Puede forzar una recolección de basura, aunque realmente no debería. Si lo hace, hágalo solo para probar ... si lo hace en producción, dañará el rendimiento mucho más que ayudarlo.

Para forzar un GC, intente (sí, dos veces):

flash.system.System.gc();
flash.system.System.gc();

Puedes leer más aquí .

Respondida el 01/08/2008 a las 02:08
fuente por usuario Karl Seguin

votos
15

Mira este artículo

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

Programador de ActionScript de IANA, sin embargo, la sensación que estoy recibiendo es que, porque el recolector de basura no se puede ejecutar cuando lo desee.

Por lo tanto, http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Así que recomendaría probar su código de colección y ver si ayuda

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}
Respondida el 01/08/2008 a las 02:08
fuente por usuario Jax

votos
13

Creo que has respondido tu propia pregunta ...

System.totalMemoryte da la cantidad total de memoria que se está "usando", no asignada. Es exacto que su aplicación solo puede usar 20mb, pero tiene 5mb que es gratis para futuras asignaciones.

No estoy seguro de si Adobe docs arrojará luz sobre la forma en que maneja la memoria ...

Respondida el 01/08/2008 a las 03:03
fuente por usuario Redbaron

votos
13

Desafortunadamente cuando se trata de la administración de memoria en Flash / actionscript no hay mucho que puedas hacer. ActionScript fue diseñado para ser fácil de usar (por lo que no querían que la gente tuviera que preocuparse por la administración de la memoria)

La siguiente es una solución, en lugar de crear una ByteArrayvariable, intente esto.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

¿Dónde byteArrayestá una propiedad dinámica de byteObject, puede liberar la memoria que se le asignó?

Respondida el 01/08/2008 a las 02:14
fuente por usuario Redbaron

votos
9

Entonces, si cargo digamos 20 MB de MySQL, en el Administrador de tareas, la RAM para la aplicación aumenta en unos 25 MB. Luego, cuando cierro la conexión y trato de eliminar el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, flash player muestra que la memoria se está liberando, lo que no es el caso.

¿El reproductor de flash está haciendo algo como Java y reserva espacio de montón y no lo libera hasta que se cierra la aplicación?

Bueno, sí y no, como habrás leído de innumerables publicaciones de blogs, el GC en AVM2 es optimista y funcionará de forma misteriosa. Así que funciona un poco como Java e intenta reservar espacio en montón, sin embargo, si lo dejas lo suficiente y comienzas a hacer otras operaciones que consumen memoria significativa, liberará ese espacio anterior. Puedes ver esto usando el generador de perfiles durante la noche con algunas pruebas ejecutándose en la parte superior de tu aplicación.

Respondida el 17/09/2008 a las 11:09
fuente por usuario Pedro

votos
7

Entonces, si cargo digamos 20 MB de MySQL, en el Administrador de tareas, la RAM para la aplicación aumenta en unos 25 MB. Luego, cuando cierro la conexión y trato de eliminar el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, flash player muestra que la memoria se está liberando, lo que no es el caso.

El jugador está "liberando" la memoria. Si minimiza la ventana y la restaura, debería ver que la memoria está ahora mucho más cerca de lo que muestra System.totalMemory.

También podría estar interesado en utilizar las herramientas de creación de perfiles de FlexBuilder, que pueden mostrarle si realmente tiene fugas de memoria.

Respondida el 06/10/2008 a las 07:16
fuente por usuario happydog