game_sync/worldsrv/dbsaver.go

163 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"strings"
"time"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
)
type SaveTaskHandler interface {
Time2Save()
}
var SaverSliceNumber = 600
var DbSaveInst = &DbSaver{
Tick: int32(SaverSliceNumber),
index: 0,
init: false,
list: make([]*SaverArray, SaverSliceNumber),
queue: make([]*BalanceQueue, 10),
pool: make(map[SaveTaskHandler]*SaverArray),
}
type DbSaver struct {
Tick int32 // 最大索引
index int32 // 循环索引
list []*SaverArray
queue []*BalanceQueue
init bool
pool map[SaveTaskHandler]*SaverArray
}
func (this *DbSaver) String() string {
buf := strings.Builder{}
buf.WriteString("DbSaver:\n")
buf.WriteString(fmt.Sprintf("Tick: %v\n", this.Tick))
buf.WriteString(fmt.Sprintf("List: %v\n", len(this.list)))
buf.WriteString(fmt.Sprintf("Queue: %v\n", len(this.queue)))
for k, v := range this.queue {
buf.WriteString(fmt.Sprintf("q%v: %v\n", k, len(v.queue)))
}
return buf.String()
}
// pushBalanceSaverArray 向队列中添加SaveTaskHandler
func (this *DbSaver) pushBalanceSaverArray(sth SaveTaskHandler) {
if sth == nil {
return
}
if _, exist := this.pool[sth]; exist {
return
}
for pos, bq := range this.queue {
size := len(bq.queue)
if size > 0 {
arr := bq.queue[size-1]
if pos+1 >= len(this.queue) {
this.queue = append(this.queue, &BalanceQueue{})
}
this.queue[pos+1].queue = append(this.queue[pos+1].queue, arr)
this.queue[pos].queue = bq.queue[:size-1]
arr.bqPos = len(this.queue[pos+1].queue) - 1
arr.Array = append(arr.Array, sth)
this.pool[sth] = arr
return
}
}
return
}
// RegisterDbSaverTask 向队列中添加SaveTaskHandler
func (this *DbSaver) RegisterDbSaverTask(i interface{}) {
if st, ok := i.(SaveTaskHandler); ok {
this.pushBalanceSaverArray(st)
}
}
// UnregisterDbSaveTask 从队列中移除SaveTaskHandler
func (this *DbSaver) UnregisterDbSaveTask(i interface{}) {
if sth, ok := i.(SaveTaskHandler); ok {
if arr, exist := this.pool[sth]; exist {
delete(this.pool, sth)
count := len(arr.Array)
for i := 0; i < count; i++ {
if arr.Array[i] == sth {
arr.Array[i] = arr.Array[count-1]
arr.Array = arr.Array[:count-1]
bqPos := arr.bqPos
queCount := len(this.queue[count].queue)
this.queue[count].queue[bqPos] = this.queue[count].queue[queCount-1]
this.queue[count].queue[bqPos].bqPos = bqPos
this.queue[count].queue = this.queue[count].queue[:queCount-1]
this.queue[count-1].queue = append(this.queue[count-1].queue, arr)
arr.bqPos = len(this.queue[count-1].queue) - 1
return
}
}
} else {
logger.Logger.Info("Player not in dbsaver")
}
}
}
// SaverArray 保存SaveTaskHandler的数组
type SaverArray struct {
Array []SaveTaskHandler
bqPos int
}
// BalanceQueue 保存SaveTaskHandler的队列
type BalanceQueue struct {
queue []*SaverArray
}
// //////////////////////////////////////////////////////////////////
// / Module Implement [beg]
// //////////////////////////////////////////////////////////////////
func (this *DbSaver) ModuleName() string {
return "dbsaver"
}
func (this *DbSaver) Init() {
if this.init == false {
for i := 0; i < len(this.queue); i++ {
this.queue[i] = &BalanceQueue{}
}
//初始化平衡数组所有平衡队列容量为0
for i := 0; i < int(this.Tick); i++ {
this.list[i] = &SaverArray{bqPos: i}
this.queue[0].queue = append(this.queue[0].queue, this.list[i])
}
this.init = true
}
}
func (this *DbSaver) Update() {
if this.index == this.Tick {
this.index = 0
}
sa := this.list[this.index]
for _, sth := range sa.Array {
sth.Time2Save()
}
this.index = this.index + 1
}
func (this *DbSaver) Shutdown() {
module.UnregisteModule(this)
}
////////////////////////////////////////////////////////////////////
/// Module Implement [end]
////////////////////////////////////////////////////////////////////
// 注册模块
func init() {
module.RegisteModule(DbSaveInst, time.Second, 0)
}