Очередь событий
Со всплытием разобрались, теперь посмотрим какие еще улучшения можно добавить. Какую бы книгу или статью по проектированию игровых движков я не брал, всегда есть упоминание того, что события можно обрабатывать синхронно или же откладывать выполнение формируя некую очередь. Каждый подход имеет право на существование, у каждого есть свои плюсы и минусы.
В отличии от синхронной рассылки событий, очередь более предсказуема. Системы спокойно заканчивают свое выполнение и только потом накопившиеся события рассылаются всем заинтересованным. Но это так же может быть и проблемой, когда к примеру, система слушает события об удалении объектов и запоздалая реакция приведет к нежелательным сайд-эффектам вроде коллизии с тем чего уже нет.
Для начала реализовал очередь без усложнений. Никаких лимитов или приоритезации. Несмотря на то, что каждый объект сам является источником событий, очередь одна на всех. В JavaScript синглтон реализуется просто – из модуля экспортируется не сам класс очереди, а уже созданный экземпляр, который используется там где нужно.
Полностью перейти на использование очереди у меня не получилось. Как я говорил выше, в некоторых случаях когда дело касается добавления или удаления объектов из сцены, отложенная реакция приводила к ошибкам и попыткам обратиться к уже уничтоженным данным. Поэтому наряду с методом dispatchEvent() для отправки события в очередь, я оставил dispatchEventImmediately() для немедленного оповещения. Второй используется только для уведомления об изменениях на сцене и вообще служит только для исключительных кейсов, когда срочность очень важно и без нее никак.