diff --git a/src/server/game/player_mod.go b/src/server/game/player_mod.go index 87d5b647..4cf86d85 100644 --- a/src/server/game/player_mod.go +++ b/src/server/game/player_mod.go @@ -41,9 +41,17 @@ import ( sevenLogin "server/game/mod/seven_login" Var "server/game/mod/var" "server/pkg/github.com/name5566/leaf/log" + "sync" "time" ) +// buffer 对象池,复用 bytes.Buffer 减少内存分配 +var bufferPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, 128*1024)) + }, +} + type PlayerData struct { Name string IsHaveDataDb bool @@ -262,17 +270,23 @@ func (p *PlayerMod) ClearData(player *Player) { } func (p *PlayerMod) BackUp(B *PlayerBackUp) { - // 预分配 buffer 容量,避免动态扩容,根据实际数据大小可调整 - now := time.Now() - buf := bytes.NewBuffer(make([]byte, 0, 128*1024)) + // 从对象池获取 buffer,复用以减少内存分配 + buf := bufferPool.Get().(*bytes.Buffer) + buf.Reset() // 清空之前的数据 + encode := gob.NewEncoder(buf) err := encode.Encode(p.mod_list) if err != nil { log.Debug("Backup, playmod error %v", err) + bufferPool.Put(buf) // 即使出错也要归还 return } - B.PlayMod = buf.Bytes() - log.Debug("backup player, cost time %v", time.Since(now)) + + // 复制数据,因为 buf 会被放回池中 + B.PlayMod = append([]byte(nil), buf.Bytes()...) + + // 归还到对象池供下次使用 + bufferPool.Put(buf) } func (p *PlayerMod) Recover(B *PlayerBackUp) {