diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 744766ad..b8c4356b 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -55,6 +55,7 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { //logging.Infof("conn[%v] disconnected", c.RemoteAddr().String()) v, _ := c.Context().(*player.ClientData) s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 + v.Lf.Close() //关闭lockfree if v.Player != nil { @@ -164,12 +165,12 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { } func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) { + if s.discorse && !conn.Context().(*player.ClientData).IsCrossDomain { + handle(conn) + } + conn.Context().(*player.ClientData).IsCrossDomain = true + for i := 0; i < s.batchRead; i++ { - for { - if s.discorse && !conn.Context().(*player.ClientData).IsCrossDomain { - handle(conn) - } - conn.Context().(*player.ClientData).IsCrossDomain = true data, err := s.codec.Decode(conn) if err == codec.ErrIncompletePacket { diff --git a/common/socket/ServerOption.go b/common/socket/ServerOption.go index 5b03b136..fd05ce46 100644 --- a/common/socket/ServerOption.go +++ b/common/socket/ServerOption.go @@ -24,6 +24,7 @@ type Server struct { handler Handler discorse bool quit bool + batchRead int } type Option func(*Server) @@ -37,6 +38,7 @@ func NewServer(options ...Option) *Server { workerPool: goroutine.Default(), bufferSize: 4096, //默认缓冲区大小 multicore: true, + batchRead: 10, //discorse: true, } for _, option := range options { diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 41b7640f..2ff08cd5 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -56,7 +56,8 @@ type ClientData struct { ERROR_CONNUT int Wsmsg *WsCodec Lf *lockfree.Lockfree[[]byte] - CloseChan chan struct{} + + CloseChan chan struct{} } func NewClientData(c gnet.Conn) *ClientData { @@ -64,12 +65,12 @@ func NewClientData(c gnet.Conn) *ClientData { handler := &eventHandler{ Conn: c, } - + lfs := lockfree.NewConditionBlockStrategy() // 创建消费端串行处理的Lockfree lf := lockfree.NewLockfree[[]byte]( 4096, handler, - lockfree.NewSleepBlockStrategy(time.Millisecond), + lfs, ) // 启动Lockfree @@ -80,7 +81,8 @@ func NewClientData(c gnet.Conn) *ClientData { IsCrossDomain: false, Player: nil, Lf: lf, - Wsmsg: &WsCodec{}, + + Wsmsg: &WsCodec{}, } return &cd @@ -432,7 +434,7 @@ func (p *Player) CanGetExp() bool { // CompleteLogin 标记登录完成并通知等待者 func (lw *Player) CompleteLogin() { - if lw.Info.MapID > 10000 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓 + if lw.Info.MapID > 500 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓 lw.Info.MapID = 1 }