AS3: быстрее использовать EventListeners или ArrayLoops?

Я пишу игру в AS3 и имею, например, около 40 объектов на экране. Допустим, это облака. Мне интересно, какой из двух путей будет меньше нагружать системные ресурсы:

а) Поместите прослушиватель событий на каждый объект и обновите его, или

б) Перебрать массив и вручную обновить каждый объект

Или разница в производительности незначительна? Любое решение масштабируется лучше, чем другие?


person Andy Moore    schedule 10.11.2009    source источник
comment
Если вы идете по пути прослушивателя событий, возможно, проверьте opensource.hobnox.com. Это специальная система событий, разработанная одними из истинных гуру Flash (Андре Мишель, Джоа Эберт). Пойду сам посмотрю :)   -  person Allan    schedule 11.11.2009


Ответы (4)


Это сложный вопрос, как сказали бы пуристы, использовать метод зацикливания массива, так как с помощью этого метода можно было бы вырезать «представление» из MVC и при этом система работала (что является хорошей проверкой работоспособности). любая система). Однако, если вы работаете с событиями, вы можете сократить некоторые углы с всплытием событий и строгой типизацией. Например, если мы предположим, что вы создаете пользовательское событие с именем CloudEvent, которое имеет свойство с именем cloud, содержащее ссылку на отправку CloudSprite, тогда, пока событие всплывает по умолчанию, вам не нужно добавлять прослушиватель событий к каждому из них. , только к DisplayObjectContainer, который их удерживает (которую я мысленно называю CloudContainer). Таким образом, событие всплывает, и вам нужно добавить только одного слушателя, и вам не нужно беспокоиться об управлении слушателями в дочерних элементах.

public function CloudContainer()
{
    super();
    addEventListener(CloudEvent.CHANGE, cloudChangeHandler);
}

private function cloudChangeHandler(evt:CloudEvent):void
{
    var cloud:CloudSprite = evt.cloud;
    cloud.update();
}

Надеюсь это поможет

person enzuguri    schedule 11.11.2009

Я ожидаю, что производительность будет довольно незначительной в любом случае. Как только вы получите много объектов, вы можете увидеть разницу (победителем станет цикл). По моему опыту, Adobe приложила немало усилий для оптимизации пути прослушивателя событий actionscript.

person Aaron    schedule 10.11.2009

У меня сложилось впечатление, что прослушивателям событий требуется больше ресурсов, поэтому лучше использовать массив, когда требуется производительность. По этой причине он также будет лучше масштабироваться. Если вы используете Flash 10, используйте вектор, я считаю, что он обеспечивает лучшую производительность, чем массив (и тип безопасности).

person Allan    schedule 10.11.2009
comment
Безопасность типа или ограничение? - person Adam Harte; 11.11.2009
comment
Единственное ограничение - это когда вам нужно создать универсальную структуру данных, и это только потому, что AS3 не поддерживает дженерики :( - person Allan; 11.11.2009

Используйте EventListeners! Просто убедитесь, что вы правильно управляете ими, т.е. удалите их, когда закончите, используйте слабые ссылки.

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

Есть несколько действительно отличных руководств, которые научат вас всему, что нужно для оптимизации в AS3. Лучшее, что я нашел, это Гранта Скиннера; Управление ресурсами AS3. И я только что нашел более быстрая версия из семи шагов. Тем не менее, я определенно рекомендую всем, кто занимается AS3, прочитать слайды Гранта Скиннера.

Конечно, не просто верьте мне на слово (или кому-либо еще, отвечающему на ваш вопрос), вы можете провести свои собственные тесты и на самом деле посмотреть, что происходит, используя профилировщик. Посмотрите последний видеоурок Ли Бримлоу, как это сделать. Это стоит посмотреть! Проверьте это здесь: GotoAndLearn — Тестирование производительности ActionScript 3.

person Adam Harte    schedule 11.11.2009
comment
Я бы не сказал, что, не используя прослушиватели событий, вы жертвуете ясностью и объектно-ориентированным программированием. То, как я программирую игры, сильно отличается от обычных интерактивных элементов. У меня, как правило, есть игровой цикл, и в нем я обновляю мир, который будет проходить через объекты и обновлять их (и, возможно, используя четырехъядерные деревья для оптимизации). Судя по моим наблюдениям, этот способ является стандартом де-факто для игрового дизайна (инфраструктура XNA, некоторые образцы кода C++). - person Allan; 11.11.2009
comment
То, что вы говорите, верно, за исключением того, что я бы в целом соответствовал лучшим практикам языка. В AS3 я обычно стараюсь следовать тому, как это делает Adobe. - person Adam Harte; 11.11.2009