Question

Mon site est entièrement en flash, il se déplace autour d'un modèle 3D qui m'a été donné sous forme de segments de vidéo que j'ai convertis en fichiers FLV.Je suis en utilisant le composant FLVPlayback de contrôle de la vidéo à l'intérieur de mon programme.Lors de l'exécution de la mémoire vérifie à l'aide du Système.de la mémoire, j'ai remarqué que chaque fois qu'une vidéo est chargé, il va manger un morceau de la mémoire, et même quand j'ai supprimer tous les écouteurs d'événement d'elle(ils sont tous faiblement référencé), retirer le composant de son parent, arrêter la vidéo et nulle de l'instance de composant, il n'est toujours pas donner de la mémoire.

Cela a été me tracasse depuis que j'ai commencé à travailler sur ce projet en raison de l'énorme quantité de vidéo, un utilisateur a la possibilité d'instancier et de la charge.Actuellement, chaque vidéo est chargé dans une nouvelle occurrence de composant FLVPlayback chaque fois que c'est nécessaire, mais j'ai lu que peut-être la meilleure façon d'aller sur ce problème est de simplement avoir un mondial occurrence de composant FLVPlayback et rechargez simplement la nouvelle vidéo dans l'ancienne instance, de cette façon, il n'y aurait qu'un seul composant FLVPlayback dans l'application de la mémoire.

Quelqu'un d'autre a rencontré ce problème?Avez-vous trouvé une meilleure solution que de recourir à une instance globale que vous venez de re-utiliser pour chaque nouvelle vidéo?

Était-ce utile?

La solution

Vous ne pouvez pas aider les problèmes de mémoire jusqu'à ce qu'Flash ajoute les destructeurs et explicite de la suppression de l'objet, malheureusement.Voir ce fil:

Déchargement d'un objet ByteArray en Actionscript 3

Il y a une limite à la quantité de mémoire Flash, applets peuvent utiliser;le GC semble à feu après avoir atteint cette limite.J'ai vu ma mémoire-facile applets utiliser de ~200 MO, juste parce qu'ils ont pendant des heures sur la fin et que le GC ne souhaite pas coup de pied dans.

Oh, et je ne pense pas qu'à l'aide d'une seule instance est une solution élégante, que ce soit.Actuellement je viens d'écrire une fonction dispose() pour mes classes personnalisées, en attendant un jour, quand il peut être transformé en un bon destructeur.

Autres conseils

Je n'ai jamais vraiment aimé les composants, ils sont un peu douteuses.Ce problème semble être commun, et un peu ennuyeux solution est, comme vous êtes suggérant, d'avoir seulement un FLVPlayback et les réutiliser.

Voici un article de blog à ce sujet

Merci pour les réponses, les liens vers les autres blog questions ont été utile aussi bien, j'avais lu tous les de Grant Skinner info sur la collecte des ordures trop, mais la recherche par le biais de ces liens et d'aller en arrière et re-lecture de ce qu'il avait d'abord dit à propos de GC contribué à l'actualisation de la vieille caboche.En plus d'invalide et de ré-instancier que seul composant FLVPlayback, j'ai aussi réalisé que je n'étais pas correctement déchargement et de détruire mon Chargeur d'instances non plus, donc je les ai nettoyé et maintenant, le programme est en cours d'exécution beaucoup plus efficacement.Je dirais que l'utilisation de la mémoire s'est améliorée de près de 90% pour le site.

@aib j'avoue que l'instance unique solution n'est pas élégant, mais parce que flash ne seront pas simplement laisser aller de ces fichiers FLV, je suis un peu coincé avec elle.

@grapefrukt je déteste les composants flash, ils peuvent causer plus de chagrin que de temps gagné, mais dans ce cas, j'ai eu beaucoup de points de repère de navigation et de choses qui se passent avec les fichiers vidéo et le composant FLVPlayback était la meilleure solution que j'ai trouvé.Bien sûr, je suis encore assez nouveau pour l'actionscript monde alors peut-être que j'ai négligé quelque chose

Je souhaite aussi que j'avais la réputation d'upvote à la fois de vos réponses, car ils étaient à la fois utile...c est la vie

De ce que je comprends après beaucoup de tests, c'est que flash charge dynamiquement dans les bibliothèques et les composants comme nécessaire, mais jamais des ordures collecte des données.Par exemple, si j'ai un site web ou une application Air qui utilise le composant FLVPlayback, la composante réelle et les bibliothèques associées ne sont pas chargés jusqu'à ce qu'un nouveau FLVPlayback() instance est créée.Il se charge alors dans la bibliothèque et en mémoire le composant, mais vous n'obtiendrez jamais ce que l'espace arrière jusqu'à ce que le programme / site web est fermé.Cette instance spécifique à l'intérieur de la vidéo, il sera nettoyée de la mémoire et de la libération de la mémoire aussi longtemps que vous retirez les auditeurs de lui, le prendre hors de la scène, et le mettre à null.

Aussi, si vous faites des vidéos individuelles, le VideoPlayer est beaucoup plus léger, et nettoie plus agréable.

Malheureusement, c'est juste la façon dont flash gère.Pas particulièrement intelligent, mais il fonctionne pour la plupart des gens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top