diff --git a/engine.go b/engine.go index 21d454bbe23528f1b627920d70a910d8e2ae5805..a4abbfa7b65aff1f8447f1bb02dc3d89f007179e 100644 --- a/engine.go +++ b/engine.go @@ -909,6 +909,7 @@ func (e *Stage) putNewID(changes []*entityChanged) error { // 相åŒæ“作,相åŒç±»åž‹çš„PO,åˆå¹¶åˆ°ä¸€ä¸ª Action func (e *Stage) makeActions(changes []*entityChanged) ([]*Action, error) { typeActions := make(map[OpType]map[reflect.Type]*Action, 3) + poTypes := []reflect.Type{} for _, item := range changes { for _, entity := range item.children { op := changeType2OP(item.changeType) @@ -921,6 +922,7 @@ func (e *Stage) makeActions(changes []*entityChanged) ([]*Action, error) { return nil, err } poType := reflect.TypeOf(po) + poTypes = append(poTypes, poType) if _, in := typeActions[op]; !in { typeActions[op] = map[reflect.Type]*Action{} } @@ -940,8 +942,12 @@ func (e *Stage) makeActions(changes []*entityChanged) ([]*Action, error) { } actions := make([]*Action, 0) for _, t := range []OpType{OpInsert, OpUpdate, OpDelete} { - for _, a := range typeActions[t] { - actions = append(actions, a) + for _, at := range poTypes { + if _, in := typeActions[t][at]; !in { + continue + } + actions = append(actions, typeActions[t][at]) + delete(typeActions[t], at) } } return actions, nil diff --git a/snapshot.go b/snapshot.go index 5e13dc43156bb844f52a6e61752b2a537ac73360..8d45c6a4ba30f2e7a7e1e543c077547f6d00de11 100644 --- a/snapshot.go +++ b/snapshot.go @@ -60,12 +60,12 @@ func (c *entityChanged) Remove(entity IEntity) bool { return true } -type simpleSet map[IEntity]bool +type simpleSet map[IEntity]int func (s simpleSet) Diff(s2 simpleSet) simpleSet { res := simpleSet{} for e := range s { - if !s2[e] { + if _, in := s2[e]; !in { res[e] = s[e] } } @@ -86,7 +86,7 @@ func (s simpleSet) Inter(s2 simpleSet) simpleSet { res := simpleSet{} for e := range s { if _, in := s2[e]; in { - res[e] = true + res[e] = s[e] } } @@ -100,6 +100,9 @@ func (s simpleSet) ToSlice() []IEntity { res[i] = e i++ } + sort.SliceStable(res, func(i, j int) bool { + return s[res[i]] < s[res[j]] + }) return res } @@ -109,8 +112,8 @@ func (s simpleSet) Empty() bool { func makeEntitySet(nodes []IEntity) simpleSet { s := simpleSet{} - for _, n := range nodes { - s[n] = true + for i, n := range nodes { + s[n] = i } return s }