2016-09-15 1 views
1

Je travaille sur une application qui prend en charge la lecture vidéo similaire à ce que Snapchat fait (vous pouvez exploiter un tas de vidéos à distance). Après avoir tapé sur une poignée de vidéos, la mise en mémoire tampon semble ralentir et s'arrêter complètement à un moment ou à un autre. Cela ressemble beaucoup à une fuite de mémoire pour moi. Après y avoir plongé dans Instruments, j'ai découvert que tous les AVPlayers, AVPlayerItems et AVPlayerLayers étaient désalloués correctement. Les seules fuites que je trouve sont les suivants:AVPlayers tampon plus lent avec le temps

enter image description here

Cependant, en étudiant le graphique Connexions et l'utilisation de la mémoire, je peux clairement voir que même après avoir rejeté le lecteur vidéo et assis dans la vue de la caméra de l'application, une mise en mémoire tampon est toujours en cours. L'activité réseau reste assez élevée et la mémoire augmente lentement.

Pour une meilleure compréhension de la lecture vidéo, voici une courte explication. J'ai un objet VideoPlayer dont je ne fais que lancer un, puis je lui donne de nouveaux éléments à jouer. Avant de lui donner un nouvel atout, j'appelle le stopBuffering, juste pour m'assurer que rien ne soit laissé pour compte (nous voyons tous à quel point c'était réussi). J'ai vérifié que cette méthode est appelée chaque fois qu'un nouvel actif est chargé. Il s'agit du graphe de machine virtuelle anonyme &, dans lequel la première génération est avant la lecture de la vidéo et la troisième génération après le départ du lecteur vidéo. Entre temps, j'ai rapidement sauté à travers environ 20 vidéos.

enter image description here

Répondre

1

La raison était que j'ai commencé avec les valeurs du chargement loadValuesAsynchronouslyForKeys chaque fois que je charge un atout, mais si je suis passé à l'actif suivant avant cette méthode terminée, je ne l'a annulé. Après avoir enregistré la AVURLAsset comme une propriété, puis en appelant

[self.asset cancelLoading]; 

à des moments appropriés, le problème a disparu.