![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
Возникла задачка.
Есть 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мс лишние погрешностью. Или я ошибаюсь, бывает столько событий? Последний раз редактировалось s8000_1; 05.11.2010 в 20:38. |
|
|||||
|
а зачем вам много баблинга?
подписывайте на фазу захвата и там тормозите ивент. попробуйте..не тестил )
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
Так я потестил. Любые обработки событий минимум в 15 раз более тормозные, чем вызов функций напрямую. Весь вопрос в том "а не дофига ли 100к событий". Причем всплывающие события в полтора раза медленнее обычных. Но с ними работать много проще.
|
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
f.g.programmer, вроде по трудоемкости реализации это то же самое, что интерфейс передавать. А обычные события все равно раз в 20 тормознее прямого вызова функции.
|
|
|||||
|
Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
|
Такое ощущение, что проблема надуманна... Вы сами можете оценить примерно, какого порядка будет количество ваших объектов, испускающие события?
|
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
ну откажитесь от событийной модели в пользу callback'ов, если траблы с производительность. Да и 100к событий - это что объекты через каждую строчку генерят события "обрабатываю n-ую строку кода"?
![]()
__________________
Загружаем картинки, минуя ошибки безопасности |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|