修正严重BUG

This commit is contained in:
sk 2025-06-14 11:50:33 +08:00
parent 42912cdae6
commit 570f9a57fd
4 changed files with 73 additions and 43 deletions

View File

@ -1,7 +1,10 @@
package data package data
import ( import (
"crypto/md5"
"fmt" "fmt"
"github.com/oylshe1314/framework/server"
"github.com/oylshe1314/framework/util"
"os" "os"
"reflect" "reflect"
"strings" "strings"
@ -12,6 +15,8 @@ type tableLoader interface {
} }
type Tables struct { type Tables struct {
dataDir string
Copy CopyTable Copy CopyTable
CopyMain CopyMainTable CopyMain CopyMainTable
Equip EquipTable Equip EquipTable
@ -35,14 +40,28 @@ type Tables struct {
UpgradeMaster UpgradeMasterTable UpgradeMaster UpgradeMasterTable
} }
func NewTables(dataDir string) (*Tables, error) { func NewTables(dataDir string) *Tables {
var tables = new(Tables) return &Tables{dataDir: dataDir}
var tt = reflect.TypeOf(tables).Elem() }
var tv = reflect.ValueOf(tables).Elem()
func (this *Tables) Load() error {
allHash, _, err := util.HashAll(md5.New(), true, nil, []string{this.dataDir}, nil)
if err != nil {
return err
}
server.DataHash = allHash[0]
var tt = reflect.TypeOf(this).Elem()
var tv = reflect.ValueOf(this).Elem()
var fn = tt.NumField() var fn = tt.NumField()
for i := range fn { for i := range fn {
var sf = tt.Field(i) var sf = tt.Field(i)
if !sf.IsExported() {
continue
}
var ft = sf.Type var ft = sf.Type
var name = ft.Name() var name = ft.Name()
if strings.HasSuffix(name, "Table") { if strings.HasSuffix(name, "Table") {
@ -56,16 +75,16 @@ func NewTables(dataDir string) (*Tables, error) {
continue continue
} }
buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", dataDir, strings.ToLower(name))) buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", this.dataDir, strings.ToLower(name)))
if err != nil { if err != nil {
return nil, err return err
} }
err = loader.load(buf) err = loader.load(buf)
if err != nil { if err != nil {
return nil, err return err
} }
} }
return tables, nil return nil
} }

View File

@ -174,6 +174,21 @@ func (this *PlayerManager) storeChanges(player *Player) {
} }
} }
func (this *PlayerManager) tick(player *Player, now, elapsed int64) int64 {
player.lock() // lock
defer player.unlock()
this.clearChanges(player)
var b = util.UnixMilli()
player.tick(now, elapsed)
var e = util.UnixMilli()
this.storeChanges(player)
return e - b
}
func (this *PlayerManager) run(player *Player) { func (this *PlayerManager) run(player *Player) {
go func(player *Player) { go func(player *Player) {
this.waitGroup.Add(1) this.waitGroup.Add(1)
@ -183,32 +198,22 @@ func (this *PlayerManager) run(player *Player) {
this.waitGroup.Done() this.waitGroup.Done()
}() }()
var b, e int64 var spend int64
var elapsed int64 = 0 var elapsed int64
for { for {
now := <-ticker.C now := <-ticker.C
elapsed++ elapsed++
player.lock() // lock spend = this.tick(player, now.Unix(), elapsed)
this.clearChanges(player)
b = util.UnixMilli()
player.tick(now.Unix(), elapsed)
e = util.UnixMilli()
this.storeChanges(player)
if this.closed || player.exited { if this.closed || player.exited {
player.unlock() // unlock
return return
} }
player.unlock() // unlock if spend >= 1000 {
if e-b >= 1000 { this.logger.Warnf("[%s:%d] The time spent executing the player loop function was too long, Time: %dms, userId: %d, roleId: %d",
this.logger.Warnf("[%s:%d] The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d",
player.Temp.Address, player.Temp.Address,
player.RoleId, player.RoleId,
e-b, spend,
player.UserId, player.UserId,
player.RoleId) player.RoleId)
} }
@ -416,10 +421,11 @@ func (this *PlayerManager) Enter(player *Player, conn *net.Conn) {
this.PutPlayer(player) this.PutPlayer(player)
player.lock() player.lock()
defer player.unlock()
this.clearChanges(player) this.clearChanges(player)
player.enter(conn) player.enter(conn)
this.storeChanges(player) this.storeChanges(player)
player.unlock()
this.run(player) this.run(player)
@ -430,8 +436,9 @@ func (this *PlayerManager) Reenter(player *Player, conn *net.Conn) {
this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
player.lock() player.lock()
defer player.unlock()
player.reenter(conn) player.reenter(conn)
player.unlock()
this.serverManager.AddOnline(1) this.serverManager.AddOnline(1)
} }
@ -442,8 +449,9 @@ func (this *PlayerManager) Exit(player *Player) {
this.RemovePlayer(player.UserId) this.RemovePlayer(player.UserId)
player.lock() player.lock()
defer player.unlock()
player.exit() player.exit()
player.lock()
this.serverManager.ReduceOnline(1) this.serverManager.ReduceOnline(1)
} }
@ -452,10 +460,20 @@ func (this *PlayerManager) Lost(player *Player) {
this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
player.lock() player.lock()
defer player.unlock()
player.lost(func() { player.lost(func() {
this.RemovePlayer(player.UserId) this.RemovePlayer(player.UserId)
}) })
player.unlock()
this.serverManager.ReduceOnline(1)
}
func (this *PlayerManager) kick(player *Player, message string) {
player.lock()
defer player.unlock()
player.kick(message)
this.serverManager.ReduceOnline(1) this.serverManager.ReduceOnline(1)
} }
@ -465,11 +483,7 @@ func (this *PlayerManager) Kick(player *Player, message string) {
this.RemovePlayer(player.UserId) this.RemovePlayer(player.UserId)
player.lock() this.kick(player, message)
player.kick(message)
player.unlock()
this.serverManager.ReduceOnline(1)
} }
func (this *PlayerManager) KickAll(message string) { func (this *PlayerManager) KickAll(message string) {
@ -479,11 +493,7 @@ func (this *PlayerManager) KickAll(message string) {
defer this.locker.Unlock() defer this.locker.Unlock()
for _, player := range this.players { for _, player := range this.players {
player.lock() this.kick(player, message)
player.kick(message)
player.unlock()
this.serverManager.ReduceOnline(1)
} }
this.players = map[uint64]*Player{} this.players = map[uint64]*Player{}
} }

View File

@ -98,8 +98,8 @@ type Player struct {
Temp PlayerTemp `bson:"-" json:"-"` Temp PlayerTemp `bson:"-" json:"-"`
//Non-data //Non-data
conn *net.Conn conn *net.Conn
mutex sync.Mutex locker sync.Mutex
exited bool exited bool
@ -129,11 +129,11 @@ func (this *Player) TipNotice(err proto.TipError) error {
} }
func (this *Player) lock() { func (this *Player) lock() {
this.mutex.Lock() this.locker.Lock()
} }
func (this *Player) unlock() { func (this *Player) unlock() {
this.mutex.Unlock() this.locker.Unlock()
} }
func (this *Player) sync() { func (this *Player) sync() {

View File

@ -282,7 +282,8 @@ func (this *gameServer) Close() error {
} }
func (this *gameServer) Load(dir string) error { func (this *gameServer) Load(dir string) error {
var dataTables, err = data.NewTables(dir) var dataTables = data.NewTables(dir)
var err = dataTables.Load()
if err != nil { if err != nil {
return err return err
} }