Merge branch 'master' of https://git.code.tencent.com/jl-framework/jl-ecs-go into HEAD
This commit is contained in:
commit
3a98a65dad
@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// 订阅该类型的事件
|
// 订阅该类型的事件
|
||||||
|
11
request.go
11
request.go
@ -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
|
||||||
}
|
}
|
||||||
|
47
world.go
47
world.go
@ -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.Execute(func() {
|
||||||
w.updateState(WorldClose)
|
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")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user