клиент flash зависает при сворачивании

#flash #actionscript-3 #actionscript

#flash #actionscript-3 #actionscript

Вопрос:

Мы создаем многопользовательскую флеш-игру с использованием actionscript 3. Предполагается, что игра должна работать в режиме реального времени.

У нас проблема, из-за которой, если вы сворачиваете игровой клиент, он зависает — я могу видеть это, предварительно просмотрев свернутое окно, мой персонаж, который должен ходить по комнате, застыл. Это вызывает проблему в реальном времени, поскольку все, что происходит при сворачивании клиента players, будет пропущено…

Кто-нибудь знает, почему клиент flash останавливается / зависает при сворачивании, и есть ли способ предотвратить это?

Комментарии:

1. Не цитируйте меня, но я почти уверен, что это врожденная функция flash Player, при которой пользовательский интерфейс перестанет обновляться, чтобы освободить процессор.

2. Так что, нет способа предотвратить это? Я только что узнал, что такая же проблема возникает в нескольких других популярных онлайн-играх… Жаль, но я не уверен, как мы можем обойти это, чтобы убедиться, что игра работает в режиме реального времени…

3. Я не знаю наверняка. Возможно, это останавливает обновление пользовательского интерфейса. И если вы выполните все свои вычисления в onEnterFrame, это прекратится. Может быть, и я говорю, может быть, если вы используете таймер для выполнения всех вычислений, это все равно может сработать.

4. Извините, что тестировал,, также не работает.

5. используете ли вы событие enterFrame? Если это так, измените его на основе таймера. Скорее всего, это решит вашу проблему.

Ответ №1:

Поведение, которое вы видите, связано с парой функций, добавленных в версии 10.1 для увеличения времени автономной работы и производительности мобильных устройств. Смотрите эту документацию для получения полной информации. Главное изменение, которое нужно понять, заключается в том, что когда SWF-файл полностью находится за пределами экрана (из-за прокрутки или табуляции), его частота кадров снижается до 2 кадров в секунду. Нет способа отключить это, AFAIK. (И я не думаю, что должно быть ..)

Что касается того, как с этим бороться, многие виды обработки должны работать нормально, при условии, что вы не делаете никаких неявных предположений о частоте кадров. Содержимое по-прежнему будет получать все те же события, что и обычно (сокеты, таймеры и т.д.), Хотя некоторые из них будут обрабатываться реже, чем обычно. Таким образом, в целом возможно (и необходимо) создавать контент, который работает во всех случаях, если вы знаете, как вы ожидаете, что время будет работать, и планируете соответственно.

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

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

Ответ №2:

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

Возможно, решением будет прекратить вычисления визуальной части, пока она свернута. Не совсем уверен, но я думаю, что все еще нет способа запустить Flash Player в фоновом режиме.