Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.11.2010, 20:03
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 1  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
По умолчанию Быстродействие 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мс лишние погрешностью. Или я ошибаюсь, бывает столько событий?


Последний раз редактировалось s8000_1; 05.11.2010 в 20:38.
Старый 05.11.2010, 23:39
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 2  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
а зачем вам много баблинга?
подписывайте на фазу захвата и там тормозите ивент. попробуйте..не тестил )
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 06.11.2010, 17:02
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 3  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

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

Старый 06.11.2010, 17:12
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 4  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Можно попробовать комбинированный вариант, передавать не IPlayground, а IEventDispatcher. Т.е. бросать невсплывающие события через некоторый глобальный для отдельного поля бросальщик событий.

Старый 06.11.2010, 17:18
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 5  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

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

Старый 07.11.2010, 04:08
Hidest вне форума Посмотреть профиль Отправить личное сообщение для Hidest Найти все сообщения от Hidest
  № 6  
Ответить с цитированием
Hidest
 
Аватар для Hidest

Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
Такое ощущение, что проблема надуманна... Вы сами можете оценить примерно, какого порядка будет количество ваших объектов, испускающие события?

Старый 07.11.2010, 04:24
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
ну откажитесь от событийной модели в пользу callback'ов, если траблы с производительность. Да и 100к событий - это что объекты через каждую строчку генерят события "обрабатываю n-ую строку кода"?

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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