Pregunta

Mi sitio web está completamente basado en flash, se mueve alrededor de un modelo 3D que me entregaron como fragmentos de video que convertí a archivos FLV.Estoy usando el componente FLVPlayback para controlar el video dentro de mi programa.Mientras ejecutaba comprobaciones de memoria usando System.totalMemory, noté que cada vez que se carga un video, consumirá una gran cantidad de memoria e incluso cuando elimino todos los detectores de eventos (todos tienen referencias débiles), elimino el componente de su padre, detenga el video y anule la instancia del componente, aún así no devolverá esa memoria.

Esto me ha estado molestando desde que comencé a trabajar en este proyecto debido a la gran cantidad de video que un usuario puede crear y cargar.Actualmente, cada video se carga en una nueva instancia de FLVPlayback cuando es necesario, pero he leído que quizás la mejor manera de solucionar este problema es simplemente tener una instancia de FLVPlayback global y simplemente volver a cargar el nuevo video en la instancia anterior, de esa manera. sólo habría un componente FLVPlayback en la memoria de la aplicación.

¿Alguien más se ha encontrado con este problema también?¿Ha encontrado una solución mejor que usar una instancia global que simplemente reutiliza para cada video nuevo?

¿Fue útil?

Solución

Desafortunadamente, no se pueden solucionar mucho los problemas de memoria hasta que Flash agregue destructores y elimine explícitamente objetos.Ver este hilo:

Descarga de un ByteArray en Actionscript 3

Hay un límite en la cantidad de memoria que pueden utilizar los subprogramas Flash;el GC parece dispararse al llegar a ese límite.He visto que mis subprogramas de fácil memoria usan hasta ~200 MB, solo porque se ejecutan durante horas y el GC no quiere activarse.

Ah, y tampoco creo que usar una sola instancia sea una solución elegante.Actualmente solo escribo una función dispose() para mis clases personalizadas, esperando algún día en que pueda convertirse en un destructor adecuado.

Otros consejos

Nunca me han gustado mucho los componentes, son un poco cutres.Este problema en particular parece ser común y la solución algo molesta es, como usted sugiere, tener solo un FLVPlayback y reutilizarlo.

Aquí hay una publicación de blog al respecto.

Gracias por las respuestas, los enlaces a las otras preguntas del blog también fueron útiles. También había leído toda la información de Grant Skinner sobre la recolección de basura, pero buscar en esos enlaces y volver atrás y releer lo que había dicho originalmente sobre GC me ayudó. refrescar la vieja cabeza.Además de anular y volver a crear una instancia de ese único componente FLVPlayback, también me di cuenta de que tampoco estaba descargando y destruyendo correctamente mis instancias de Loader, así que las limpié y ahora el programa se ejecuta de manera mucho más eficiente.Yo diría que el uso de la memoria ha mejorado alrededor del 90% en el sitio.

@aib Admito que la solución de instancia única no es elegante, pero como Flash simplemente no suelta esos archivos FLV, estoy un poco atascado con ella.

@grapefrukt Detesto los componentes flash, normalmente causan más dolor que tiempo ahorrado, sin embargo, en este caso tenía muchos puntos de referencia y elementos de navegación con los archivos de video y el componente FLVPlayback fue la mejor solución que encontré.Por supuesto, todavía soy bastante nuevo en el mundo del actionscript, así que tal vez pasé por alto algo.

También desearía tener la reputación de votar a favor de sus dos respuestas porque ambas fueron útiles...así es la vida

De lo que deduzco después de muchas pruebas es que flash carga dinámicamente bibliotecas y componentes según sea necesario, pero nunca recolecta basura esos datos.Por ejemplo, si tengo un sitio web o una aplicación Air que utiliza el componente FLVPlayback, el componente real y las bibliotecas asociadas con él no se cargan hasta que se crea una nueva instancia de FLVPlayback().Luego se cargará en la biblioteca y el componente en la memoria, pero nunca recuperará ese espacio hasta que se cierre el programa/sitio web.Esa instancia específica con el video dentro será recolectada como basura y liberará algo de memoria siempre que elimines a los oyentes, la saques del escenario y la configures como nula.

Además, si está haciendo vídeos individuales, VideoPlayer es mucho más ligero y se limpia mejor.

Desafortunadamente, así es como Flash lo maneja.No es particularmente inteligente, pero funciona para la mayoría de las personas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top