Как заставить Flash «хорошо играть с другими»? - PullRequest
1 голос
/ 21 апреля 2010

Что до сем. Так что это не вопрос о схемах управления памятью; для тех из вас, кто может не знать, виртуальная машина Flash использует сборку мусора с помощью подсчета ссылок, а также отметки и очистки (для хорошего освещения этих тем ознакомьтесь с статьей и презентации Гранта Скиннера) 1004 *). И да, Flash также предоставляет оператор «delete», который (к сожалению, только) можно использовать для удаления свойств динамических объектов.

Что я хочу знать, так это как сделать так, чтобы программы Flash не продолжали использовать процессор и память при работе в фоновом режиме (например, сохранять загрузку содержимого или осуществлять удаленный обмен данными). Мотивация для этого вопроса частично объясняется запретом Apple на кросс-скомпилированные приложения (в его SDK 4) на том основании, что они не ведут себя так, как предсказывалось с функцией многозадачности , которая является центральной для iPhone OS 4. Я намерен не только для создания Flash-программ, которые будут «проходить проверку», насколько многозадачность в iPhone OS 4, но также и для создания более качественных Flash-программ.

Другими словами, как приложение Flash может имитировать функцию многозадачности iPhone OS 4? Предоставляет ли Flash API разработчику возможность переводить свои приложения в спящий режим во время работы других программ, а затем так же быстро «пробуждать» их?

В нашей собственной программе мы могли бы сделать что-то столь же грубое, как обнаружение, когда пользователь бездействовал (без движения мыши или нажатия клавиши) в течение, скажем, четырех секунд:

var idle_id:uint = setInterval(4000, pause_program);
var current_movie_clip:MovieClip;
var current_frame:uint;

...

// on Mouse move or key press...
clearInterval(idle_id);
idle_id = setInterval(4000, pause_program);

...

function pause_program():void
{
 current_movie_clip = event.target as MovieClip;
 current_frame = current_movie_clip.currentFrame;
 MovieClip(root).gotoAndStop("program_pause_screen");
}

(на экране паузы программы)

resume_button.addEventListener(MouseEvent.CLICK, resume_program);

function resume_program(event:MouseEvent)
{
 current_movie_clip.gotoAndPlay(current_frame);
}

Если это правильная идея, как лучше всего определить, что приложение должно быть отложено?

И, что более важно, может ли проигрыватель Flash Player обнаружить, что некоторые из его запущенных программ бездействуют, и аналогичным образом отложить их до тех пор, пока пользователь не выполнит действие для их возобновления?

(Пожалуйста, не стесняйтесь отвечать на столько или меньше вопросов, которые я задавал.)

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Ну, я бы не стал долго дышать на iphone os в ближайшее время.

http://www.engadget.com/2010/04/21/adobe-halts-investment-in-iphone-specific-flash-dev-tools-has-a/

1 голос
/ 21 апреля 2010

в основном, вы можете использовать Event.ACTIVATE и Event.DEACTIVATE, чтобы узнать, когда ваше приложение теряет фокус.

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

относительно iPhone: это не то, о чем вам следует беспокоиться. если Adobe когда-нибудь найдет способ получить флеш на iPhone, я полагаю, что их уровень абстракции будет адаптирован для максимально эффективной работы с iPhone OS. Внутренняя работа реализации родного флеш-плеера определенно не будет вам доступна, поскольку для этого потребуется огромное обновление API, возможно, даже новые коды операций и очень прямой доступ к слоям, к которым вы не должны иметь доступа в изолированной среде, так как флеш плеер есть.

...