feat(socket): 使用bytebufferpool优化内存分配并重构消息处理机制 引入bytebufferpool减少内存分配开销,在ServerEvent.go中修改数据处理逻辑, 将直接的数据拷贝改为使用缓冲池。同时移除原有的消息通道机制,改用lock
This commit is contained in:
@@ -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)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user