Проблемы с памятью компонента FLVPlayback

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

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

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

22.08.2008 20:44:55
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

1
23.05.2017 12:19:34

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

0
25.08.2008 11:54:49

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

Вот пост в блоге об этом

2
25.08.2008 13:08:52

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

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

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

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

1
25.08.2008 16:09:02

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

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

1
10.12.2009 19:45:14