【架构优化】list设置容量,避免动态扩容

This commit is contained in:
hahwu 2026-02-05 16:27:34 +08:00
parent 46a76843a9
commit 8345076c28
10 changed files with 20 additions and 280 deletions

View File

@ -607,7 +607,7 @@ func GetOrderItemList() []int {
log.Debug("GetOrderItemList err:%v", err) log.Debug("GetOrderItemList err:%v", err)
return nil return nil
} }
r := make([]int, 0) r := make([]int, 0, len(data))
for k := range data { for k := range data {
Id := GoUtil.Int(k) Id := GoUtil.Int(k)
if Id == 0 { if Id == 0 {
@ -665,7 +665,7 @@ func GetDailyTaskListById(Id int) []int {
return nil return nil
} }
Type := GetDailyTaskType(Id) Type := GetDailyTaskType(Id)
r := make([]int, 0) r := make([]int, 0, len(data))
for k, v := range data { for k, v := range data {
if gamedata.GetIntValue(v, "Type") == Type { if gamedata.GetIntValue(v, "Type") == Type {
r = append(r, GoUtil.Int(k)) r = append(r, GoUtil.Int(k))

View File

@ -151,61 +151,6 @@ func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
return return
} }
// 更新数据
func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, len1)
Values := make([]interface{}, len1)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
index := 0
var keyValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
if field.Tag.Get("db") == UpdateAttr {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 {
Values[index] = ufield.Int()
}
index++
}
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, ",")
strLen := len(origin)
origin = origin[:strLen-1]
origin = origin + " WHERE " + Exclude + " = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
return
}
return
}
// "UPDATE user SET age = ?, degree = ? WHERE id = ?" // "UPDATE user SET age = ?, degree = ? WHERE id = ?"
func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) { func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u) t := reflect.TypeOf(u)
@ -381,52 +326,6 @@ func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) {
return return
} }
func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, len)
Values := make([]interface{}, len)
pp := reflect.ValueOf(u)
origin := "SELECT * FROM " + tableName + " WHERE "
index := 0
var keyValue interface{}
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values[index] = ufield.Int()
}
index++
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, " AND ")
sqlStr := origin
if err := SqlDb.Get(u, sqlStr, Values...); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
return err
}
return
}
func GetServerData(d interface{}, Key string) (err error) { func GetServerData(d interface{}, Key string) (err error) {
sqlDb := GetDB() sqlDb := GetDB()
if sqlDb == nil { if sqlDb == nil {
@ -487,103 +386,6 @@ func GetPlayerClientData(d interface{}, Key string) (err error) {
return return
} }
func InsertData(u interface{}, tableName string) (insertID int64, err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, 0)
Fields1 := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "INSERT INTO " + tableName + "("
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") == "id" {
continue
}
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String && ufield.String() == "" {
continue
}
if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 {
continue
}
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, field.Tag.Get("db"))
Fields1 = append(Fields1, "?")
}
for i := range Fields {
Fields[i] = "`" + Fields[i] + "`"
}
origin += strings.Join(Fields, ",")
origin += ") VALUES("
origin += strings.Join(Fields1, ",")
origin += ")"
sqlStr := origin
result, err := SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err)
return
}
insertID, err = result.LastInsertId()
if err != nil {
log.Debug("InsertData exec failed, err:%v\n", err)
return
}
return
}
func UpdateData(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
var ExcludeValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" {
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?")
}
if field.Tag.Get("db") == Exclude {
if k == reflect.String {
ExcludeValue = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
ExcludeValue = append(Values, ufield.Int())
}
}
}
Values = append(Values, ExcludeValue)
origin += strings.Join(Fields, ",")
origin = origin + " WHERE `" + Exclude + "` = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("update failed, sql %s err:%v\n", sqlStr, err)
return
}
return
}
func GetServerMailData(data *[]*SqlServerMailStruct) error { func GetServerMailData(data *[]*SqlServerMailStruct) error {
sql := "select * from system_mail_info" sql := "select * from system_mail_info"
err := SqlDb.Select(data, sql) err := SqlDb.Select(data, sql)

View File

@ -472,7 +472,6 @@ func G_getGameLogic() *GameLogic {
G_GameLogicPtr.RegisterEvent() // 注册事件 G_GameLogicPtr.RegisterEvent() // 注册事件
G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口 G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口
G_GameLogicPtr.InitActivity() // 初始化活动 G_GameLogicPtr.InitActivity() // 初始化活动
G_GameLogicPtr.GetVersion() // 获取版本号
if conf.Server.ServerType == "center" { if conf.Server.ServerType == "center" {
G_GameLogicPtr.CreateFriendMgr() //创建好友管理器 G_GameLogicPtr.CreateFriendMgr() //创建好友管理器
G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器 G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器
@ -501,28 +500,6 @@ func (ad *GameLogic) InitServerInfo() {
ad.SeverInfo = ServerInfo ad.SeverInfo = ServerInfo
} }
func (ad *GameLogic) GetVersion() {
sqlStr := "SELECT * FROM t_gameserver WHERE id = ?"
sqlStruck := db.SqlVersionStruct{}
IsHaveDataDb := false
sqlStruck.Id = 1
G_GameLogicPtr.Version = 0
if err := db.SqlDb.Get(&sqlStruck, sqlStr, 1); err != nil {
G_GameLogicPtr.Version = 1
IsHaveDataDb = false
} else {
G_GameLogicPtr.Version = sqlStruck.IsClose + 1
IsHaveDataDb = true
}
sqlStruck.IsClose = G_GameLogicPtr.Version
if IsHaveDataDb {
db.FormatAllMemUpdateDb(&sqlStruck, "t_gameserver", "id")
} else {
db.FormatAllMemInsertDb(&sqlStruck, "t_gameserver")
}
}
func (ad *GameLogic) SendServerVersion(a gate.Agent) { func (ad *GameLogic) SendServerVersion(a gate.Agent) {
res := &msg.ResServerVersion{} res := &msg.ResServerVersion{}
res.Version = G_GameLogicPtr.Version res.Version = G_GameLogicPtr.Version

View File

@ -221,7 +221,7 @@ func (p *Player) GuessColorBackData() {
Status := p.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR) Status := p.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR)
GuessColorMod := p.PlayMod.getGuessColorMod() GuessColorMod := p.PlayMod.getGuessColorMod()
MapList := make([]*msg.GuessColorInfo, 0) MapList := make([]*msg.GuessColorInfo, 0, len(GuessColorMod.MapList))
for _, v := range GuessColorMod.MapList { for _, v := range GuessColorMod.MapList {
MapList = append(MapList, &msg.GuessColorInfo{ MapList = append(MapList, &msg.GuessColorInfo{
Map: v, Map: v,
@ -252,7 +252,7 @@ func (p *Player) RaceBackData() {
} }
Status := p.GetActivityStatus(activity.ACT_TYPE_RACE) Status := p.GetActivityStatus(activity.ACT_TYPE_RACE)
RaceMod := p.PlayMod.getRaceMod() RaceMod := p.PlayMod.getRaceMod()
Opponent := make([]*msg.Raceopponent, 0) Opponent := make([]*msg.Raceopponent, 0, len(RaceMod.Opponent))
for _, v := range RaceMod.Opponent { for _, v := range RaceMod.Opponent {
Opponent = append(Opponent, &msg.Raceopponent{ Opponent = append(Opponent, &msg.Raceopponent{
Id: int32(v.Id), Id: int32(v.Id),
@ -352,7 +352,7 @@ func (p *Player) CatnipBackData() {
return return
} }
FriendMod := p.PlayMod.getFriendMod() FriendMod := p.PlayMod.getFriendMod()
GameList := make([]*msg.CatnipGame, 0) GameList := make([]*msg.CatnipGame, 0, len(CatnipMod.Game))
for _, v := range CatnipMod.Game { for _, v := range CatnipMod.Game {
GameInfo := &msg.CatnipGame{ GameInfo := &msg.CatnipGame{
Id: int32(v.Id), Id: int32(v.Id),
@ -373,7 +373,6 @@ func (p *Player) CatnipBackData() {
GameList = append(GameList, GameInfo) GameList = append(GameList, GameInfo)
} }
tmpData := make(map[int]*msg.CatnipInvite) tmpData := make(map[int]*msg.CatnipInvite)
InviteList := make([]*msg.CatnipInvite, 0)
for uid, info := range CatnipMod.InviteList { for uid, info := range CatnipMod.InviteList {
tmpData[uid] = &msg.CatnipInvite{ tmpData[uid] = &msg.CatnipInvite{
Uid: int64(uid), Uid: int64(uid),
@ -410,6 +409,7 @@ func (p *Player) CatnipBackData() {
invite.Type = 4 // 已参与游戏的好友不显示邀请 invite.Type = 4 // 已参与游戏的好友不显示邀请
} }
} }
InviteList := make([]*msg.CatnipInvite, 0, len(tmpData))
for _, v := range tmpData { for _, v := range tmpData {
ResPlayerSimple := G_getGameLogic().GetResSimplePlayerByUid(int(v.Uid)) ResPlayerSimple := G_getGameLogic().GetResSimplePlayerByUid(int(v.Uid))
if ResPlayerSimple != nil { if ResPlayerSimple != nil {

View File

@ -1099,7 +1099,7 @@ func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.It
} }
func ExcludeCardStar(CardList []int) []int { func ExcludeCardStar(CardList []int) []int {
StarList := make([]int, 0) StarList := make([]int, 0, len(CardList))
for _, v := range CardList { for _, v := range CardList {
Star := cardCfg.GetStarById(v) Star := cardCfg.GetStarById(v)
if Star < 2 || Star > 4 { if Star < 2 || Star > 4 {

View File

@ -224,7 +224,7 @@ func (c *CardMod) BackData() *msg.ResCardInfo {
} }
cardList = append(cardList, &msg.Card{Id: int32(k), Count: int32(v)}) cardList = append(cardList, &msg.Card{Id: int32(k), Count: int32(v)})
} }
ReqUid := make([]int64, 0) ReqUid := make([]int64, 0, len(c.ReqFriend))
for _, v := range c.ReqFriend { for _, v := range c.ReqFriend {
if v.EndTime < GoUtil.Now() { if v.EndTime < GoUtil.Now() {
delete(c.ReqFriend, v.BUid) delete(c.ReqFriend, v.BUid)
@ -232,7 +232,7 @@ func (c *CardMod) BackData() *msg.ResCardInfo {
} }
ReqUid = append(ReqUid, int64(v.BUid)) ReqUid = append(ReqUid, int64(v.BUid))
} }
ExUid := make([]int64, 0) ExUid := make([]int64, 0, len(c.ExCard))
for k, v := range c.ExCard { for k, v := range c.ExCard {
if v.EndTime < GoUtil.Now() { if v.EndTime < GoUtil.Now() {
delete(c.ExCard, k) delete(c.ExCard, k)
@ -514,7 +514,7 @@ func (c *CardMod) NotifyCard() *msg.ResNotifyCard {
} }
func (c *CardMod) NotifyTimes() *msg.ResNotifyCardTimes { func (c *CardMod) NotifyTimes() *msg.ResNotifyCardTimes {
ReqUid := make([]int64, 0) ReqUid := make([]int64, 0, len(c.ReqFriend))
for k, v := range c.ReqFriend { for k, v := range c.ReqFriend {
if v.EndTime < GoUtil.Now() { if v.EndTime < GoUtil.Now() {
delete(c.ReqFriend, k) delete(c.ReqFriend, k)
@ -522,7 +522,7 @@ func (c *CardMod) NotifyTimes() *msg.ResNotifyCardTimes {
} }
ReqUid = append(ReqUid, int64(k)) ReqUid = append(ReqUid, int64(k))
} }
ExUid := make([]int64, 0) ExUid := make([]int64, 0, len(c.ExCard))
for k, v := range c.ExCard { for k, v := range c.ExCard {
if v.EndTime < GoUtil.Now() { if v.EndTime < GoUtil.Now() {
delete(c.ExCard, k) delete(c.ExCard, k)
@ -590,7 +590,7 @@ func (c *CardMod) SeasonFirstReward() ([]*item.Item, error) {
} }
func (c *CardMod) GetCardList() []int { func (c *CardMod) GetCardList() []int {
cardList := make([]int, 0) cardList := make([]int, 0, len(c.CardList))
for k, v := range c.CardList { for k, v := range c.CardList {
if v > 0 { if v > 0 {
cardList = append(cardList, k) cardList = append(cardList, k)

View File

@ -20,42 +20,3 @@ func GetChessDiamond(Lv, Type int) int {
} }
return max(1, d) return max(1, d)
} }
// func getChessMainRand(Color string) []*Rand {
// r := make([]*Rand, 0)
// for i := 6; i <= 10; i++ {
// Diamond := int(math.Pow(2, float64(i-1)) / 2.5)
// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
// if ChessId == 0 {
// continue
// }
// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
// }
// return r
// }
// func getChessSecondaryRand(Color string) []*Rand {
// r := make([]*Rand, 0)
// for i := 5; i <= 9; i++ {
// Diamond := int((math.Pow(2, float64(i-1)) / 2.5) * 2)
// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
// if ChessId == 0 {
// continue
// }
// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
// }
// return r
// }
// func getChessSubRand(Color string) []*Rand {
// r := make([]*Rand, 0)
// for i := 5; i <= 9; i++ {
// Diamond := int(math.Pow(2, float64(i-1))/2.5 + 6.4)
// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color)
// if ChessId == 0 {
// continue
// }
// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond})
// }
// return r
// }

View File

@ -149,7 +149,7 @@ func (cb *ChessBorad) ComposeChess(id int) (int, error) {
return 0, errors.New("已达最大等级") return 0, errors.New("已达最大等级")
} }
count := 0 count := 0
newList := make([]int, 0) newList := make([]int, 0, len(cb.ChessList))
for _, chess := range cb.ChessList { for _, chess := range cb.ChessList {
if chess == id && count < 2 { if chess == id && count < 2 {
count++ count++
@ -457,17 +457,17 @@ func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo {
Count: int32(v.Num), Count: int32(v.Num),
}) })
} }
Re := make([]string, 0) Re := make([]string, 0, len(cb.Retire))
for k, v := range cb.Retire { for k, v := range cb.Retire {
if v == EMIT_RETIRE_END { if v == EMIT_RETIRE_END {
Re = append(Re, k) Re = append(Re, k)
} }
} }
Ho := make([]int32, 0) Ho := make([]int32, 0, len(cb.Honor))
for k := range cb.Honor { for k := range cb.Honor {
Ho = append(Ho, int32(k)) Ho = append(Ho, int32(k))
} }
Rw := make([]string, 0) Rw := make([]string, 0, len(cb.RetireReward))
for k, v := range cb.RetireReward { for k, v := range cb.RetireReward {
if v == true { if v == true {
Rw = append(Rw, k) Rw = append(Rw, k)
@ -633,7 +633,7 @@ func (cb *ChessBorad) RetireOrder(EmitType string) error {
if cb.Retire[EmitType] != 1 { if cb.Retire[EmitType] != 1 {
return errors.New("chess has not been retired") return errors.New("chess has not been retired")
} }
chess := make([]int, 0) chess := make([]int, 0, len(cb.ChessMap))
EmitProduct := mergeDataCfg.GetEmitOrderProduce(EmitType) EmitProduct := mergeDataCfg.GetEmitOrderProduce(EmitType)
for k, v := range cb.ChessMap { for k, v := range cb.ChessMap {
arr := strings.Split(k, "@") arr := strings.Split(k, "@")

View File

@ -30,7 +30,7 @@ const (
func (player *Player) MailTrigger(Tr *quest.Trigger) bool { func (player *Player) MailTrigger(Tr *quest.Trigger) bool {
MailMod := player.PlayMod.getMailMod() MailMod := player.PlayMod.getMailMod()
TriggerMail := mailCfg.GetTriggerMail() TriggerMail := mailCfg.GetTriggerMail()
t := make([]*mailCfg.TriggerMail, 0) t := make([]*mailCfg.TriggerMail, 0, len(TriggerMail))
for _, v := range TriggerMail { for _, v := range TriggerMail {
if GoUtil.InArray(v.Id, MailMod.TriggerMail) { if GoUtil.InArray(v.Id, MailMod.TriggerMail) {
continue continue

View File

@ -26,9 +26,9 @@ func main() {
lconf.ListenAddr = conf.Server.ListenAddr lconf.ListenAddr = conf.Server.ListenAddr
lconf.CenterAddr = conf.Server.CenterAddr lconf.CenterAddr = conf.Server.CenterAddr
lconf.PendingWriteNum = conf.PendingWriteNum lconf.PendingWriteNum = conf.PendingWriteNum
// 当内存>2G时开始GC // 当内存>256M时开始GC
debug.SetGCPercent(50) debug.SetGCPercent(50)
debug.SetMemoryLimit(2 << 30) debug.SetMemoryLimit(512 << 20)
// 启动 pprof仅绑定本地 // 启动 pprof仅绑定本地
go func() { go func() {
// 如果需要绑定所有接口改为 ":6060" // 如果需要绑定所有接口改为 ":6060"