AS3: быстрее использовать EventListeners или ArrayLoops? - PullRequest
1 голос
/ 10 ноября 2009

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

a) Поместите eventListener на каждый объект и сделайте так, чтобы он сам обновился, или

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

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

Ответы [ 4 ]

1 голос
/ 10 ноября 2009

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

0 голосов
/ 11 ноября 2009

Это хитрая задача, сказали бы пуристы, чтобы использовать метод зацикливания массивов, так как с помощью этого метода можно было бы исключить «представление» из 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();
}

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

0 голосов
/ 11 ноября 2009

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

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

Есть несколько действительно хороших руководств, которые научат вас всем об оптимизации в AS3. Лучший из найденных мной - Grant Skinner's; Управление ресурсами AS3 . И я только что нашел более быструю семиступенчатую версию . Тем не менее, я бы порекомендовал всем, кто делает AS3, читать слайды Grant Skinner.

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

0 голосов
/ 11 ноября 2009

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

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