This commit is contained in:
xzb 2023-11-07 14:02:43 +08:00
commit 3a98a65dad
3 changed files with 37 additions and 29 deletions

View File

@ -49,6 +49,12 @@ func (me *EventType[T]) Publish(wd World, event *T) {
}) })
} }
// 内部发布事件(同步发布,并直接触发)
func (me *EventType[T]) internalPublish(wd World, event *T) {
me.et.Publish(wd, *event)
processAllEvents(wd)
}
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
// 订阅该类型的事件 // 订阅该类型的事件

View File

@ -30,7 +30,7 @@ func NewErrResult(err error) Result[EmptyType] {
// 请求世界执行给定函数 // 请求世界执行给定函数
func Request[T any](w World, handler func() Result[T]) chan Result[T] { func Request[T any](w World, handler func() Result[T]) chan Result[T] {
future := make(chan Result[T]) future := make(chan Result[T])
w.Execute(func() { err := w.Execute(func() {
result := handler() result := handler()
select { select {
// 即使外面不接收也不会卡停World运行 // 即使外面不接收也不会卡停World运行
@ -38,5 +38,14 @@ func Request[T any](w World, handler func() Result[T]) chan Result[T] {
default: default:
} }
}) })
// 世界执行错误直接响应错误
if err != nil {
go func() {
select {
case future <- Result[T]{Err: err}:
default:
}
}()
}
return future return future
} }

View File

@ -43,7 +43,7 @@ type (
// 添加系统 // 添加系统
AddSystem(sys ...ISystem) AddSystem(sys ...ISystem)
// 在世界中执行处理逻辑(在世界运行线程中) // 在世界中执行处理逻辑(在世界运行线程中)
Execute(fn HandleFunc) Execute(fn HandleFunc) error
} }
// 处理函数 // 处理函数
@ -147,11 +147,10 @@ func (w *world) updateState(state WorldState) {
old := w.state old := w.state
slog.Debug("世界状态变更", "oldstate", old, "state", state) slog.Debug("世界状态变更", "oldstate", old, "state", state)
w.state = state w.state = state
WorldStateChangeEvent.Publish(w, &WorldStateChange{ WorldStateChangeEvent.internalPublish(w, &WorldStateChange{
OldState: old, OldState: old,
NewState: state, NewState: state,
}) })
WorldStateChangeEvent.et.ProcessEvents(w)
} }
} }
@ -186,17 +185,24 @@ func (w *world) StartUp() {
} }
// 在世界线程执行逻辑 // 在世界线程执行逻辑
func (w *world) Execute(fn HandleFunc) { func (w *world) Execute(fn HandleFunc) error {
if w.state == WorldError {
return fmt.Errorf("世界运行异常,无法执行请求")
} else if w.state != WorldRunning && w.state != WorldPause {
return fmt.Errorf("世界已经关闭,无法执行请求")
}
w.toBeExecuteds <- fn w.toBeExecuteds <- fn
return nil
} }
// 关闭世界 // 关闭世界
func (w *world) Close() { func (w *world) Close() {
if w.state == WorldRunning || w.state == WorldPause { if w.state == WorldRunning || w.state == WorldPause {
w.updateState(WorldClose) w.Execute(func() {
w.updateState(WorldClose)
})
} else if w.state == WorldError { } else if w.state == WorldError {
w.updateState(WorldClosed) w.updateState(WorldClosed)
w.handleRequestAndEvent()
} }
} }
@ -225,6 +231,7 @@ func (w *world) run() {
} }
}() }()
for range w.ticker.C { for range w.ticker.C {
slog.Debug("世界运行")
if w.state == WorldClose { if w.state == WorldClose {
// 世界正常关闭 // 世界正常关闭
w.close() w.close()
@ -232,7 +239,6 @@ func (w *world) run() {
} }
// start := time.Now() // start := time.Now()
if w.state != WorldRunning { // 世界非运行状态 if w.state != WorldRunning { // 世界非运行状态
w.handleRequestAndEvent()
continue continue
} }
if w.times >= 1 { if w.times >= 1 {
@ -241,7 +247,10 @@ func (w *world) run() {
for _, sys := range w.systems { for _, sys := range w.systems {
sys.Update(w) sys.Update(w)
} }
w.handleRequestAndEvent() // 执行待执行逻辑
w.executeTodos()
// 处理所有事件
processAllEvents(w)
} }
w.times = w.times - float64(times) + w.speed w.times = w.times - float64(times) + w.speed
} else { } else {
@ -252,21 +261,13 @@ func (w *world) run() {
} }
} }
// 处理请求和事件执行
func (w *world) handleRequestAndEvent() {
// 执行待执行逻辑
w.executeTodos()
// 处理所有事件
processAllEvents(w)
}
// 世界运行异常处理 // 世界运行异常处理
func (w *world) exception(err any) { func (w *world) exception(err any) {
slog.Error("世界出现异常", "error", err) // slog.Error("世界运行异常", "error", err, "stack", string(debug.Stack()))
w.updateState(WorldError) w.updateState(WorldError)
// // 关闭定时器 // 关闭定时器
// w.ticker.Stop() w.ticker.Stop()
w.handleRequestAndEvent() // w.handleRequestAndEvent()
} }
// 世界正常关闭逻辑 // 世界正常关闭逻辑
@ -275,13 +276,5 @@ func (w *world) close() {
w.updateState(WorldClosed) w.updateState(WorldClosed)
// 关闭定时器 // 关闭定时器
w.ticker.Stop() w.ticker.Stop()
go func() {
defer func() {
if err := recover(); err != nil {
slog.Error("世界关闭监听处理可能异常", "error", err)
}
}()
w.handleRequestAndEvent()
}()
slog.Debug("世界关闭finish") slog.Debug("世界关闭finish")
} }