Files
vRp.CD2g_test/server/lockstep

Lockstep

Go doc

暂无介绍...

目录导航

列出了该 package 下所有的函数及类型定义,可通过目录导航进行快捷跳转 ❤️

展开 / 折叠目录导航

包级函数定义

函数名称 描述
NewLockstep 创建一个锁步(帧)同步默认实现的组件(Lockstep)进行返回
WithFrameLimit 通过特定逻辑帧上限创建锁步(帧)同步组件
WithFrameRate 通过特定逻辑帧率创建锁步(帧)同步组件
WithSerialization 通过特定的序列化方式将每一帧的数据进行序列化
WithInitFrame 通过特定的初始帧创建锁步(帧)同步组件

类型定义

类型 名称 描述
INTERFACE Client 帧同步客户端接口定义
STRUCT StoppedEventHandle 暂无描述...
STRUCT Lockstep 锁步(帧)同步默认实现
STRUCT Option 暂无描述...

详情信息

func NewLockstep(options ...Option[ClientID, Command]) *Lockstep[ClientID, Command]

创建一个锁步(帧)同步默认实现的组件(Lockstep)进行返回

查看 / 收起单元测试

func TestNewLockstep(t *testing.T) {
	ls := lockstep.NewLockstep[string, int](lockstep.WithInitFrame[string, int](1))
	ls.JoinClient(&Cli{id: "player_1"})
	ls.JoinClient(&Cli{id: "player_2"})
	count := 0
	ls.StartBroadcast()
	endChan := make(chan bool)
	go func() {
		for {
			ls.AddCommand(random.Int(1, 9999))
			count++
			if count >= 10 {
				break
			}
			time.Sleep(time.Millisecond * time.Duration(random.Int(10, 200)))
		}
		ls.StopBroadcast()
		endChan <- true
	}()
	<-endChan
	time.Sleep(time.Second)
	fmt.Println("end")
}


func WithFrameLimit(frameLimit int64) Option[ClientID, Command]

通过特定逻辑帧上限创建锁步(帧)同步组件

  • 当达到上限时将停止广播

func WithFrameRate(frameRate int64) Option[ClientID, Command]

通过特定逻辑帧率创建锁步(帧)同步组件

  • 默认情况下为 15/s

func WithSerialization(handle func (frame int64, commands []Command) []byte) Option[ClientID, Command]

通过特定的序列化方式将每一帧的数据进行序列化

  • 默认情况下为将被序列化为以下结构体的JSON字符串

    type Frame struct { Frame int json:"frame" Commands []Command json:"commands" }


func WithInitFrame(initFrame int64) Option[ClientID, Command]

通过特定的初始帧创建锁步(帧)同步组件

  • 默认情况下为 0即第一帧索引为 0

Client INTERFACE

帧同步客户端接口定义

  • 客户端应该具备ID及写入数据包的实现
type Client[ID comparable] interface {
	GetID() ID
	Write(packet []byte, callback ...func(err error))
}

StoppedEventHandle STRUCT

type StoppedEventHandle[ClientID comparable, Command any] func(lockstep *Lockstep[ClientID, Command])

Lockstep STRUCT

锁步(帧)同步默认实现

  • 支持最大帧上限 WithFrameLimit
  • 自定逻辑帧频率默认为每秒15帧(帧/66ms) WithFrameRate
  • 自定帧序列化方式 WithSerialization
  • 从特定帧开始追帧
  • 兼容各种基于TCP/UDP/Unix的网络类型可通过客户端实现其他网络类型同步
type Lockstep[ClientID comparable, Command any] struct {
	running                     bool
	runningLock                 sync.RWMutex
	initFrame                   int64
	frameRate                   int64
	frameLimit                  int64
	serialization               func(frame int64, commands []Command) []byte
	clients                     map[ClientID]Client[ClientID]
	clientFrame                 map[ClientID]int64
	clientLock                  sync.RWMutex
	currentFrame                int64
	currentCommands             []Command
	currentFrameLock            sync.RWMutex
	frameCache                  map[int64][]byte
	frameCacheLock              sync.RWMutex
	ticker                      *time.Ticker
	lockstepStoppedEventHandles []StoppedEventHandle[ClientID, Command]
}

Option STRUCT

type Option[ClientID comparable, Command any] func(lockstep *Lockstep[ClientID, Command])