diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index a742bdad..cbfb8669 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -86,7 +86,8 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) { //logging.Infof("conn[%v] disconnected", c.RemoteAddr().String()) v, _ := c.Context().(*player.ClientData) - v.LF.Close() + //v.LF.Close() + // v.LF.Close() if v.Player != nil { v.Player.Save() //保存玩家数据 @@ -281,10 +282,12 @@ func (s *Server) onevent(c gnet.Conn, v []byte) { } else { header.Data = nil // 避免空切片分配 } - //t.OnEvent(header) - s.workerPool.Submit(func() { - t.LF.Producer().Write(header) - }) + t.OnEvent(header) + // t.LF.Push(header) + // s.workerPool.Submit(func() { + // t.LF.Push(header) + // // t.LF.Producer().Write(header) + // }) } } diff --git a/logic/service/fight/input.go b/logic/service/fight/input.go index 7b412c08..c5c14600 100644 --- a/logic/service/fight/input.go +++ b/logic/service/fight/input.go @@ -179,7 +179,7 @@ func (f *FightC) initplayer(c common.PlayerI) (*input.Input, errorcode.ErrorCode pet := model.GenPetInfo(int(v.MonID), 24, int(v.Nature), int(v.Effect[0]), int(v.Lv), nil, 0) var color data.GlowFilter err := json.Unmarshal([]byte(v.Color), &color) - if err == nil { + if err == nil && color.Alpha != 0 { pet.ShinyInfo = append(pet.ShinyInfo, color) } diff --git a/logic/service/player/pack.go b/logic/service/player/pack.go index 600ba027..c9280a50 100644 --- a/logic/service/player/pack.go +++ b/logic/service/player/pack.go @@ -7,7 +7,6 @@ import ( "encoding/binary" "encoding/hex" "sync" - "time" "context" @@ -15,7 +14,6 @@ import ( "fmt" "reflect" - "github.com/bruceshao/lockfree" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" "github.com/gogf/gf/v2/os/glog" @@ -89,8 +87,30 @@ func XORDecryptU(encryptedData []byte, key uint32) []byte { return result } +// 原 OnEvent 改为仅负责投递消息到通道 +func (cd *ClientData) OnEvent(data common.TomeeHeader) { + + // 非阻塞发送,避免通道满时阻塞 eventloop + select { + case cd.MsgChan <- data: + default: + cool.Logger.Error(context.TODO(), "消息通道已满,丢弃消息", data.UserID, data.CMD) + // 通道满时的降级处理:记录日志,避免消息丢失(可选) + //cool.Logger.Warn(context.TODO(), "消息通道已满,丢弃消息", data.UserID, data.CMD) + } +} + +// 消费消息的协程:处理业务逻辑,不阻塞 eventloop +func (cd *ClientData) consumeMsg() { + for header := range cd.MsgChan { + // 执行原有的 OnEvent 逻辑 + cd.handleBizLogic(header) + } +} + +// 重写 // 遍历结构体方法并执行RECV_cmd -func (h *ClientData) OnEvent(data common.TomeeHeader) { +func (h *ClientData) handleBizLogic(data common.TomeeHeader) { defer func() { if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 // 1. 打印错误信息 @@ -199,8 +219,7 @@ func (h *ClientData) OnEvent(data common.TomeeHeader) { } t1 := data.Pack(ret[0].Interface()) - //cool.Loger.Debug(context.Background(), "发送数据_回包", data.UserID, data.CMD, ret[0].Interface(), hex.EncodeToString(t1)) - //data.Version = 49 + playerconn.SendPack(t1) } @@ -212,9 +231,9 @@ type ClientData struct { ERROR_CONNUT int Wsmsg *WsCodec Conn gnet.Conn - LF *lockfree.Lockfree[common.TomeeHeader] + //LF *gqueue.TQueue[common.TomeeHeader] //SaveL sync.Once //保存锁 - + MsgChan chan common.TomeeHeader //SaveDone chan struct{} } @@ -224,18 +243,33 @@ func NewClientData(c gnet.Conn) *ClientData { cd := &ClientData{ - Conn: c, - Wsmsg: &WsCodec{}, - } - cd.LF = lockfree.NewLockfree( - 8, - cd, - lockfree.NewSleepBlockStrategy(time.Millisecond), - ) - // // 启动Lockfree - if err := cd.LF.Start(); err != nil { - panic(err) + Conn: c, + Wsmsg: &WsCodec{}, + MsgChan: make(chan common.TomeeHeader, 100), } + //cd.LF = make(chan common.TomeeHeader, 8) + // cd.LF = gqueue.NewTQueue[common.TomeeHeader](1) + // go func() { + // for { + // select { + // case queueItem := <-cd.LF.C: + // cd.OnEvent(queueItem) + + // } + // } + + // }() + // cd.LF = lockfree.NewLockfree( + // 8, + // cd, + // lockfree.NewSleepBlockStrategy(time.Millisecond), + // ) + // // // 启动Lockfree + // if err := cd.LF.Start(); err != nil { + // panic(err) + // } + // 启动每个连接的独立消费协程 + go cd.consumeMsg() // // // 启动Lockfree // // if err := cd.LF.Start(); err != nil { // // panic(err) diff --git a/logic/service/player/rpc.go b/logic/service/player/rpc.go index 89364ac1..827e4a66 100644 --- a/logic/service/player/rpc.go +++ b/logic/service/player/rpc.go @@ -1,8 +1,25 @@ package player +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" +) + // rpc,跨服匹配的玩家,只做数据的传输 type RPC_player struct { baseplayer // serviceid uint32 //玩家所在的ID } + +func (f *RPC_player) SendPackCmd(cmd uint32, data any) { + + conn, _ := g.Redis("cool").Conn(context.TODO()) + + defer conn.Close(context.TODO()) + conn.Do(context.TODO(), "publish", "sun:send", cmd, data) + + //fmt.Println("战斗结束") + +}