Skip to content

Commit b148181

Browse files
authored
Merge observerManagerData back into observerManager (#438)
1 parent 37c1155 commit b148181

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## [[v0.6.3]](https://github.com/mlange-42/ark/compare/v0.6.2...v0.6.3)
4+
5+
### Other
6+
7+
- Merges `observerManagerData` back into `observerManager` (#437)
8+
39
## [[v0.6.2]](https://github.com/mlange-42/ark/compare/v0.6.1...v0.6.2)
410

511
### Performance

ecs/events.go

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,12 @@ func (e Event) Emit(entity Entity) {
109109

110110
// observerManager manages observers and distributes events.
111111
type 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 {
128125
func 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.
272270
func (m *observerManager) HasObservers(evt EventType) bool {
273-
return len(m.observers[evt]) > 0
271+
return m.hasObservers[evt]
274272
}
275273

276274
func (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

302300
func (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

382380
func (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

ecs/types_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ func TestTypeSizes(t *testing.T) {
131131
printTypeSize[Observer]()
132132
printTypeSize[observerData]()
133133
printTypeSize[observerManager]()
134-
printTypeSize[observerManagerData]()
135134
printTypeSizeName[Map2[Position, Velocity]]("Map2")
136135
printTypeSizeName[Filter2[Position, Velocity]]("Filter2")
137136
printTypeSizeName[Query2[Position, Velocity]]("Query2")

0 commit comments

Comments
 (0)