服务器在保存玩家数据时的频次和触发机制怎么设计
思路
- 定时保存
定时保存可以通过设置定时器来实现,但也有两种方式:服务器定时、玩家定时。
- 离线保存
玩家下线后立即保存数据,保证玩家的数据被完整存档。
实现
玩家保存
1 | type role struct { |
进阶
但是这样设计无论玩家数据是否改变都会进行写操作,所以可以在保存数据之前检查数据是否更改。
1 | type player struct { |
最后
示例使用 Golang 语言,这里面还涉及一个 Go 的结构体比较的问题。
如果结构体中的字段皆为可比较类型,那么结构体可以用于比较运算。如果包含不可比较类型,那么则不可以用于比较运算。
假设角色结构修改如下
1 | type role struct { |
代码则会抛出异常invalid operation: *p.role == p.lastRole (struct containing []uint32 cannot be compared)
,显然现在的结构体无法直接使用比较运算符,针对这种场景 Go 官方在 reflect 包提供了 DeepEqual()函数。deepequal.go
1 | func (p *player) Save() { |