Проблемы с памятью компонента FLVPlayback - PullRequest
1 голос
/ 23 августа 2008

Мой веб-сайт полностью основан на флэш-памяти, он перемещается по трехмерной модели, которая была предоставлена ​​мне в виде фрагментов видео, которые я преобразовал в файлы FLV. Я использую компонент FLVPlayback для управления видео внутри моей программы. Во время выполнения проверок памяти с использованием System.totalMemory я заметил, что всякий раз, когда видео загружается, оно съедает кусок памяти и даже когда я удаляю из него все прослушиватели событий (на них все слабо ссылаются), удаляет компонент из его родитель, остановите видео и обнулите экземпляр компонента, он все равно не вернет эту память.

Это беспокоило меня с тех пор, как я начал работать над этим проектом, из-за огромного количества видео, которое пользователь потенциально может создать и загрузить. В настоящее время каждое видео загружается в новый экземпляр FLVPlayback всякий раз, когда это требуется, но я читал, что, возможно, лучший способ решить эту проблему - просто иметь глобальный экземпляр FLVPlayback и просто перезагрузить новое видео в старый экземпляр, таким образом. в памяти приложения будет только один компонент FLVPlayback.

Кто-нибудь еще сталкивался с этой проблемой? Нашли ли вы лучшее решение, чем использование глобального экземпляра, который вы просто повторно используете для каждого нового видео?

Ответы [ 5 ]

2 голосов
/ 25 августа 2008

Мне никогда не нравились компоненты, они немного хитры. Эта конкретная проблема кажется распространенной, и несколько раздражающее решение, как вы предлагаете, иметь только один FLVPlayback и использовать его повторно.

Вот сообщение в блоге об этом

1 голос
/ 10 декабря 2009

Из того, что я понял после большого тестирования, флэш-память динамически загружается в библиотеки и компоненты по мере необходимости, но эти данные никогда не собираются мусором. Например, если у меня есть веб-сайт или приложение Air, которое использует компонент FLVPlayback, фактический компонент и связанные с ним библиотеки не загружаются, пока не будет создан новый экземпляр FLVPlayback (). Затем он будет загружен в библиотеку и компонент в память, но вы никогда не вернете это пространство, пока программа / веб-сайт не будет закрыта. Этот конкретный экземпляр с видео внутри него будет собирать мусор и освобождать некоторую память, пока вы удаляете из него слушателей, снимаете его со сцены и устанавливаете в ноль.

Кроме того, если вы снимаете отдельные видео, VideoPlayer намного легче и лучше очищается.

1 голос
/ 25 августа 2008

Спасибо за ответы, ссылки на другие вопросы блога также были полезны, я также прочитал всю информацию Гранта Скиннера о сборке мусора, но просматривая эти ссылки и возвращаясь и перечитывая то, что он первоначально сказал про GC помог освежить старый noggin. В дополнение к обнулению и повторному созданию этого единственного компонента FLVPlayback, я также понял, что неправильно выгружал и уничтожал свои экземпляры Loader, поэтому я их очистил, и теперь программа работает намного эффективнее. Я бы сказал, что использование памяти для сайта улучшилось примерно на 90%.

@ aib Я признаю, что решение для одного экземпляра не элегантно, но, поскольку flash просто не отпустит эти FLV-файлы, я как бы застрял с ним.

@ grapefrukt Я ненавижу компоненты флеш-памяти, они, как правило, вызывают больше горя, чем сэкономленного времени, однако в этом случае у меня было много ключевых точек и элементов навигации, связанных с видеофайлами, и компонент FLVPlayback был лучшим решением, которое я нашел , Конечно, я все еще довольно новичок в мире ActionScript, так что, возможно, я что-то упустил

Мне также хотелось бы, чтобы у меня была репутация, чтобы опровергнуть оба ваших ответа, потому что они оба были полезны ... c'est la vie

1 голос
/ 25 августа 2008

К сожалению, вы не сможете помочь с проблемами с памятью, пока Flash не добавит деструкторы и явное удаление объектов. Смотрите эту тему:

Выгрузка ByteArray в Actionscript 3

Существует ограничение на количество памяти, которое могут использовать Flash-апплеты; GC, похоже, стреляет по достижении этого предела. Я видел, как мои апплеты, работающие с памятью, используют до 200 МБ только потому, что они работают часами подряд, а сборщик мусора не хочет этого делать.

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

0 голосов
/ 25 августа 2008

К сожалению, именно так справляется вспышка. Не особенно умный, но он работает для большинства людей.

...