@@ -109,15 +109,12 @@ func (e Event) Emit(entity Entity) {
109109
110110// observerManager manages observers and distributes events.
111111type observerManager struct {
112- * observerManagerData
113- observers [][]* observerData // Observers per event type
114- allComps []bitMask // Union of all observed components per event type
115- allWith []bitMask // Union of all "with"-components per event type
116- anyNoComps []bool // Presence of wildcard component observers per event type
117- anyNoWith []bool // Presence of wildcard "with" observers per event type
118- }
119-
120- type observerManagerData struct {
112+ observers [][]* observerData // Observers per event type
113+ hasObservers []bool // Presence of any observers per event type
114+ allComps []bitMask // Union of all observed components per event type
115+ allWith []bitMask // Union of all "with"-components per event type
116+ anyNoComps []bool // Presence of wildcard component observers per event type
117+ anyNoWith []bool // Presence of wildcard "with" observers per event type
121118 pool intPool [observerID ] // Pool for observer IDs
122119 indices map [observerID ]uint32 // Mapping for observer locations for fast removal
123120 totalCount uint32 // Total number of observers
@@ -128,15 +125,14 @@ type observerManagerData struct {
128125func newObserverManager () * observerManager {
129126 maxEvents := math .MaxUint8 + 1
130127 return & observerManager {
131- observers : make ([][]* observerData , maxEvents ),
132- anyNoComps : make ([]bool , maxEvents ),
133- anyNoWith : make ([]bool , maxEvents ),
134- allComps : make ([]bitMask , maxEvents ),
135- allWith : make ([]bitMask , maxEvents ),
136- observerManagerData : & observerManagerData {
137- pool : newIntPool [observerID ](32 ),
138- indices : map [observerID ]uint32 {},
139- },
128+ observers : make ([][]* observerData , maxEvents ),
129+ hasObservers : make ([]bool , maxEvents ),
130+ anyNoComps : make ([]bool , maxEvents ),
131+ anyNoWith : make ([]bool , maxEvents ),
132+ allComps : make ([]bitMask , maxEvents ),
133+ allWith : make ([]bitMask , maxEvents ),
134+ pool : newIntPool [observerID ](32 ),
135+ indices : map [observerID ]uint32 {},
140136 }
141137}
142138
@@ -195,6 +191,7 @@ func (m *observerManager) AddObserver(o *Observer, w *World) {
195191
196192 m .indices [o .id ] = uint32 (len (m .observers [o .event ]))
197193 m .observers [o .event ] = append (m .observers [o .event ], & o .observerData )
194+ m .hasObservers [o .event ] = true
198195 if o .event > m .maxEventType {
199196 m .maxEventType = o .event
200197 }
@@ -239,6 +236,7 @@ func (m *observerManager) RemoveObserver(o *Observer) {
239236 }
240237 observers [last ] = nil
241238 m .observers [o .event ] = observers [:last ]
239+ m .hasObservers [o .event ] = last > 0
242240 m .totalCount --
243241
244242 var allWith bitMask
@@ -270,11 +268,11 @@ func (m *observerManager) RemoveObserver(o *Observer) {
270268
271269// HasObservers returns whether there is any registered observer for the given event type.
272270func (m * observerManager ) HasObservers (evt EventType ) bool {
273- return len ( m . observers [evt ]) > 0
271+ return m . hasObservers [evt ]
274272}
275273
276274func (m * observerManager ) FireCreateEntityIfHas (e Entity , mask * bitMask ) {
277- if ! m .HasObservers ( OnCreateEntity ) {
275+ if ! m .hasObservers [ OnCreateEntity ] {
278276 return
279277 }
280278 m .FireCreateEntity (e , mask , true )
@@ -300,7 +298,7 @@ func (m *observerManager) FireCreateEntity(e Entity, mask *bitMask, earlyOut boo
300298}
301299
302300func (m * observerManager ) FireCreateEntityRelIfHas (e Entity , mask * bitMask ) {
303- if ! m .HasObservers ( OnAddRelations ) {
301+ if ! m .hasObservers [ OnAddRelations ] {
304302 return
305303 }
306304 m .FireCreateEntityRel (e , mask , true )
@@ -380,7 +378,7 @@ func (m *observerManager) FireRemoveEntityRel(e Entity, mask *bitMask, earlyOut
380378}
381379
382380func (m * observerManager ) FireAddIfHas (evt EventType , e Entity , oldMask * bitMask , newMask * bitMask ) {
383- if ! m .HasObservers ( evt ) {
381+ if ! m .hasObservers [ evt ] {
384382 return
385383 }
386384 m .FireAdd (evt , e , oldMask , newMask , true )
@@ -521,7 +519,7 @@ func (m *observerManager) Reset() {
521519 }
522520
523521 for i := range m .maxEventType + 1 {
524- if ! m .HasObservers ( i ) {
522+ if ! m .hasObservers [ i ] {
525523 continue
526524 }
527525 obs := m .observers [i ]
@@ -530,6 +528,7 @@ func (m *observerManager) Reset() {
530528 o .id = maxObserverID
531529 }
532530 m .observers [i ] = m .observers [i ][:0 ]
531+ m .hasObservers [i ] = false
533532 m .allComps [i ].Reset ()
534533 m .allWith [i ].Reset ()
535534 m .anyNoComps [i ] = false
0 commit comments