player and dimension loader with ecs system

This commit is contained in:
Tnze
2022-05-27 00:38:46 +08:00
parent d2f7db9d0d
commit 474d6a229b
34 changed files with 956 additions and 795 deletions

44
server/ecs/dispatcher.go Normal file
View File

@ -0,0 +1,44 @@
package ecs
import "sync"
type Dispatcher struct {
waiters map[string][]*sync.WaitGroup
tasks []func(w *World, wg *sync.WaitGroup)
}
func NewDispatcher() *Dispatcher {
return &Dispatcher{
waiters: make(map[string][]*sync.WaitGroup),
tasks: nil,
}
}
func (d *Dispatcher) Add(s System, name string, deps []string) {
var start sync.WaitGroup
start.Add(len(deps))
for _, dep := range deps {
if wg, ok := d.waiters[dep]; ok {
d.waiters[dep] = append(wg, &start)
} else {
panic("Unknown deps: " + dep)
}
}
d.tasks = append(d.tasks, func(w *World, done *sync.WaitGroup) {
start.Wait()
defer done.Done()
s.Update(w)
for _, wg := range d.waiters[name] {
wg.Done()
}
})
}
func (d *Dispatcher) Run(w *World) {
var wg sync.WaitGroup
wg.Add(len(d.tasks))
for _, f := range d.tasks {
go f(w, &wg)
}
wg.Wait()
}