Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Вот запись в блоге об этом

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top