гибкая производительность, вызовы методов или события - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь выбить некоторые циклы процессора из своего приложения и хочу знать, какие наименее ресурсоемкие методы используются для выполнения кода.

Возьмите эти 2 примера.Первый - это энтерфрейм, запускающий и вызывающий различные методы.Второй - тот же кадр ввода, но вместо этого отправляются события.

1) Вероятно ли, что один из этих блоков будет менее интенсивным по сравнению с другим?

2) В первом примередолжен ли фрейм ждать завершения методов 1, 2 и 3, прежде чем следующий фрейм сможет отрендерить и выполнить код?

3) Во втором примере могут ли события, отправленные методу 1 2 и 3, выполняться вкадр, кроме того, который вызвал это?Например, если процессор находится под давлением, может ли он отложить выполнение?

public function enterframe(e:Event):void
{
method1();
method2();
method3();
}

public function enterframe(e:Event):void
{
dispatchEvent(MethodEvent.Test, method1);
dispatchEvent(MethodEvent.Test, method2);
dispatchEvent(MethodEvent.Test, method2);
}

Ответы [ 4 ]

1 голос
/ 04 мая 2011

Я думаю, что лучшее, что вы можете сделать с оптимизацией, это забыть enterFrame событие. Поместите Timer в свой код и установите задержку в соответствии с вашими потребностями. Вы можете легко испытать огромную оптимизацию.

Насколько я знаю enterFrame подключен к фпс. Так что, если ваш фильм имеет 30 кадров в секунду, он будет воспроизводиться 30 раз в секунду.

Теперь это означает, что это больше похоже на интервал (flash.utils.setInterval) или Timer.

Таким образом, вы можете видеть, что enterFrame - более или менее простой способ установить интервал или функцию, подобную интервалу. Если вы знаете свои потребности, частоту обновления и прочее, вы можете установить таймер и интервал более точно, чтобы значительно увеличить производительность.

1 голос
/ 04 мая 2011

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

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

1 голос
/ 04 мая 2011

Редактировать: поскольку я запутался в событиях, отправляемых встроенными функциями в проигрывателе Flash Player, и в пользовательских событиях, отправляемых кодом as3, мой первый ответ неверен.Хотя сам Flash Player является многопоточным, вы не можете получить доступ к функциям потоков в as3.Вот мой исправленный ответ:

1) Вероятно, один из этих энтерфреймов будет менее интенсивным по сравнению с другим?

Хорошо, если вы посмотритепри количестве инструкций у того, кто отправляет событие, больше инструкций, пока он фактически не выполнит код в методах.Сначала нужно просмотреть список прослушивателей событий и найти нужный в этом конкретном объекте по сравнению с данным типом события.

2) В первом примере должен ли кадр ждать завершения методов 1, 2 и 3, прежде чем следующий кадр сможет отрендерить и выполнить код?

Да,То же самое происходит во втором примере.

3) Могут ли во втором примере события, отправленные методу 1, 2 и 3, выполняться в кадре, отличном от того, который его вызвал?Например, если процессор находится под давлением, может ли он отложить выполнение?

Нет, они выполняются процедурным образом.


Старый ответ:

1) Вероятно ли, что один из этих энтерфреймов будет менее интенсивным по сравнению с другим?

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

2) В первом примере должен ли кадр ждать завершения методов 1, 2 и 3, прежде чем следующий кадр сможет отрендерить и выполнить код?

Да.

3) Могут ли во втором примере события, отправленные методу 1, 2 и 3, выполняться в кадре, отличном от того, который его вызвал?Например, если процессор находится под давлением, может ли он отложить выполнение?

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

0 голосов
/ 04 мая 2011

Похоже, вы ошибаетесь в dispatchEvent(MethodEvent.Test, method1); Сначала вы должны использовать addEventListener .

addEventListener(MethodEvent.Test, method1);
addEventListener(MethodEvent.Test, method2);
addEventListener(MethodEvent.Test, method3);

А потом dispatchEvent(MethodEvent.Test);. Там нет значительной разницы в производительности между этими 2 вариантами. Диспетчерское событие просто вызывает каждую функцию в массиве слушателей. Таким образом, единственная проблема с производительностью заключается в циклической обработке массива слушателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...