```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

feat(socket): 使用bytebufferpool优化内存分配并重构消息处理机制

引入bytebufferpool减少内存分配开销,在ServerEvent.go中修改数据处理逻辑,
将直接的数据拷贝改为使用缓冲池。同时移除原有的消息通道机制,改用lock
This commit is contained in:
昔念
2026-03-04 14:00:55 +08:00
parent 98c4caac68
commit fc8fc1ed8d
3 changed files with 55 additions and 71 deletions

View File

@@ -18,6 +18,7 @@ import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/panjf2000/gnet/v2"
"github.com/valyala/bytebufferpool"
)
func (s *Server) Boot(serverid, port uint32) error {
@@ -86,9 +87,9 @@ 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()
close(v.MsgChan)
//close(v.MsgChan)
if v.Player != nil {
v.Player.Save() //保存玩家数据
@@ -279,17 +280,16 @@ func (s *Server) onevent(c gnet.Conn, v []byte) {
// 解析数据部分17字节之后
// 数据部分:直接引用切片,避免 make
if len(v) > 17 {
header.Data = make([]byte, len(v[17:]))
copy(header.Data, v[17:]) // 核心修改:拷贝数据
} else {
header.Data = nil // 避免空切片分配
header.Data = bytebufferpool.Get()
header.Data.Write(v[17:])
//copy(header.Data, v[17:]) // 核心修改:拷贝数据
}
t.OnEvent(header)
//t.OnEvent(header)
// t.LF.Push(header)
// s.workerPool.Submit(func() {
// t.LF.Push(header)
// // t.LF.Producer().Write(header)
// })
s.workerPool.Submit(func() {
t.LF.Producer().Write(header)
// t.LF.Producer().Write(header)
})
}
}