Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Быстродействие bubbling (http://www.flasher.ru/forum/showthread.php?t=146372)

s8000_1 05.11.2010 20:03

Быстродействие bubbling
 
Возникла задачка.

Есть 2 игровых поля, которые отображаются рядом друг с другом. На каждой - набор человечков. У каждого человечка набор предметов.
Клик по предмету на человечке первого поля вызывает какие-то действия на первом поле (например, рассыпаются монетки). Клик по предмету на человечке второго поля вызывает другие действия второго поля (над человечком появляется всплывающее окно с информацией).

Структура классов такая:

Playground1 -> humans (array) -> Human -> items (array) -> Item
Playground2 -> humans (array) -> human -> items (array) -> Item

Вопрос состоит в том, как наиболее просто и быстро организовать вызов различных функций Playground1 (рассыпать монетки) и Playground2 (открыть всплывающе окно).

Варианты следующие:

1) Сделать интерфейс IPlayground с функцией handleClick и передать ссылку на Playground сначала человечкам, а потом предметам и вызывать эту функцию напрямую из экземпляра Item'ов.

У данного подхода есть минус. Например, когда мы делаем админку человечков. И на AdminPlayground находятся те же самые Human'ы, а функция IPlayground handleClick не нужна, но нужен обработчик события mouseDown. Придется добавить так же handleMouseDown в интерфейс. Получается, что в специфических PlayGround'ах будут дергаться абсолютно все функции интерфейса во всех возможных событиях впустую.

2) Испускать экземплярами Item bubbling события типа "ItemClick", "ItemMouseDown" и подписывать на них обработчики в экземплярах Playground'а. Та же проблема - будет много лишних bubbling событий.

В первом случае намного более громоздкий код с передачей ссылки на интерфейс-контроллер. Во втором случае код гораздо проще, но много лишних bubbling событий.


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

Есть ли еще изящные решения этой проблемы (например, написать, какой-нибудь свой испускатель событий и др.)?

UPD.
Сделал тест.

Пустая структура:
Playground - > Human - > Item

1) 100к раз испускаем всплывающее событие из Item'а, которое подхватывает Playground - 500мс
2) 100к раз испускаем всплывающие событие из Item'а, которое никем не подхватывается - 300мс
3) Передал Item'у ссылку на Playground и вызвал его пустую функцию 100к раз - 20 мс.

Вопрос в том, как еще можно решить мою задачу менее нагружено по коду и так же быстро, как п. 3) Хотя 100к событий это очень много. Вряд ли какой-либо проект столько испускает, и можно считать эти 100мс лишние погрешностью. Или я ошибаюсь, бывает столько событий?

cleptoman 05.11.2010 23:39

а зачем вам много баблинга?
подписывайте на фазу захвата и там тормозите ивент. попробуйте..не тестил )

s8000_1 06.11.2010 17:02

Так я потестил. Любые обработки событий минимум в 15 раз более тормозные, чем вызов функций напрямую. Весь вопрос в том "а не дофига ли 100к событий". Причем всплывающие события в полтора раза медленнее обычных. Но с ними работать много проще.

f.g.programmer 06.11.2010 17:12

Можно попробовать комбинированный вариант, передавать не IPlayground, а IEventDispatcher. Т.е. бросать невсплывающие события через некоторый глобальный для отдельного поля бросальщик событий.

s8000_1 06.11.2010 17:18

f.g.programmer, вроде по трудоемкости реализации это то же самое, что интерфейс передавать. А обычные события все равно раз в 20 тормознее прямого вызова функции.

Hidest 07.11.2010 04:08

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

i.o. 07.11.2010 04:24

ну откажитесь от событийной модели в пользу callback'ов, если траблы с производительность. Да и 100к событий - это что объекты через каждую строчку генерят события "обрабатываю n-ую строку кода"? ;)


Часовой пояс GMT +4, время: 08:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.