Flex VideoDisplay просто плоские утечки - PullRequest
3 голосов
/ 25 ноября 2011

И на самом деле я нашел решение сам, но когда я искал форумы Adobe и здесь ранее и обнаружил, что проблема неоднократно появлялась, но никогда не решалась, подумал, что я отвечу здесь на свой собственный вопрос в интересах будущих поисков в Google кого-то.

Но, в любом случае, это утечка, и, судя по предыдущим комментаторам, в целом множестве сценариев. В моем случае он находится в SWFLoader в другом SWFLoader, и когда родительский SWFLoader уходит, видео остается в памяти, и никакая комбинация removeEventListeners или gc.collect или того, что вы используете в обработчике RemovedFromStage, не решит проблему. Вы можете остановить видео там, чтобы оно не продолжало воспроизводиться, но оно все еще остается в памяти, и еще около 10 Мб добавляется при каждом запуске.

И в скобках, я просто озадачен тем, как Adobe могла позволить чему-то подобному этому постоянно оставаться незафиксированным, как они. Очевидно, что где-то в их собственном коде есть какой-то Eventlistener, который никогда не выпускается, но, очевидно, им наплевать. Я предполагаю, что подобные вещи должны быть, по крайней мере, одной из причин того, что вспышка становится все более маргинальной. Для меня также странно, что разработчики флеш-памяти также не осознают проблему, которые думают, что это не проблема, пока буквально не израсходована вся системная память и не произойдет сбой браузера. Что ж, если исходить из обычной разработки приложений, то недопустимо видеть в диспетчере задач, что память постоянно увеличивается, каждый раз, когда пользователь нажимает кнопку и никогда не отпускает.

Итак, изначально я начал искать сторонние проигрыватели Flex Video и сразу же столкнулся с Open Source Media Framework . И в их пакете на самом деле есть множество различных методов и классов, с помощью которых можно вызывать видео. И я попробовал некоторые из них (MediaPlayerSprite, MediaContainer, VideoElement, LightweightVideoElement и т. Д.), Но все они также просочились, и точно так же, как FlexD Videoplay! Очевидно, что Flex VideoDisplay использует код OSMF за кулисами, я думаю (возможно). Так или иначе, совсем другая компания, которой нет дела до утечек - невероятно, необъяснимо.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Просто используйте оригинальный flash.media.Video. Вам также нужно будет создать NetStream отдельно, NetConnection, а также запустить собственный таймер, если вы хотите иметь такую ​​функциональность, как в VideoDisplay, которая автоматически обновляет время воспроизведения во время работы. (Вы должны сделать это и самостоятельно отслеживать ход загрузки с помощью своего собственного таймера.) Вам также нужно сделать некоторые вещи в обработчике removeFromStage, чтобы избежать утечек. Это действительно важная часть, но для инициализации всего, что-то вроде следующего:

var uic:UIComponent = new UIComponent();          
var ns:NetStream;         
var v:Video = new Video();        
var nc:NetConnection = new NetConnection();      
var timer:Timer = new Timer(250);         

...

uic.addChild(v);    
this.addChild(uic);     
v.width=Number(parameters.w);   
v.height=Number(parameters.h);  

nc.connect(null);        
ns  = new NetStream(nc);        
ns.addEventListener("netStatus",play_end);  
uic.addEventListener("removedFromStage",v_remove);  

v.attachNetStream(ns);        

ns.play(session.source);        
ns.pause();         

timer.addEventListener("timer",load_handlr);        
timer.start();          

И в удаленном обработчике FromStage:

private function v_remove(e:Event) {      

  ns.close();      
  nc.close();   

  v.attachNetStream(null);  

  timer.stop()      
}

Вот и все. Так что, что интересно, ни один из созданных мной списков событий не нужно было удалять, просто нужно было остановить один таймер. А также вызов nc.close и т. Д. (На самом деле не уверен, действительно ли v.attachNetStream (null); строго необходим). VideoDisplay имеет свой собственный метод close (), но я пробовал его и не влиял на утечку в VideoDisplay.

Так что выше останавливает видео и предотвращает утечку. В моем случае я хочу, чтобы видео продолжало воспроизводиться до конца, и для этого мне пришлось удалить других слушателей событий, чтобы оно не продолжало перезапускаться в цикле (и память не освобождалась по этой причине), и затем прервите вызов ns.close, чтобы он воспроизводился до конца:

private function v_remove(e:Event) {

  nc.close();

  v.attachNetStream(null);

  timer.stop()
  timer.removeEventListener("timer",timer_handlr);
  ns.removeEventListener("netStatus",play_end);
  uic.removeEventListener("removedFromStage",v_remove);

}

Так что я думаю, что это просто какая-то полезная тайная алхимия для тех, кто все еще занимается разработкой флэш Почему Adobe не может предоставить какой-либо универсальный метод для полного уничтожения произвольного объекта на свой страх и риск, я думаю, мы никогда не узнаем.

0 голосов
/ 26 ноября 2011

Не уверен, поможет ли это вам, но я успешно выгрузил видео (во Flash, а не во Flex) при использовании компонента видео. Видео не очищается (и не просачивается), если вы не сделаете это (videoPlayer - мой экземпляр Component) ...

         try{

            for each(var v: VideoPlayer in videoPlayer.flvplayback_internal::videoPlayers){
                log("Cleaning up VideoPlayer:" + v);
                v.close();
                v.clear();
            }


        }catch(e:Error){
            log("EndVideo Failed: " + e);
        }
...