Documentation
¶
Overview ¶
Package fieldmask 提供字段级脏标记与增量编码原语,用于 MMO/SLG 场景下的 细粒度状态同步——只传输被修改的字段,而非全量实体快照。
解决的问题:一个 MMO 角色有几百个属性(血量、蓝量、坐标、装备、buff 列表…), 当其中一个字段改变时,如果用 replicate 的实体级 DirtySet 下发整个 EntityState, 会浪费大量带宽。本包在 replicate 之下提供更细的一层:字段级位图脏标记。
核心机制:
- Tracker[K]:为每个实体维护一个字段脏位图(bitmap);
- 业务调用 SetField(entity, field) 标记某实体的某个字段已改;
- 每帧末调用 Flush 取走所有脏实体及其脏字段列表,交给序列化层只打包这些字段。
与相邻原语的关系:
- replicate.DirtySet 是实体级"谁变了",fieldmask 是字段级"谁的什么变了";
- 业务可在 SetField 时同步调用 DirtySet.Mark,两层联动;
- bitmap 包提供底层位操作,fieldmask 在其上包装实体×字段的二维脏追踪;
- 序列化格式(protobuf FieldMask / 自定义二进制)不在本包职责内——本包只负责 "标脏、查脏、清脏",编码方式由业务决定。
并发安全:Tracker 用 sync.Mutex 保护(tick goroutine 写 + 出口读 Flush)。 零值不可用:用 NewTracker 构造。
Index ¶
- type Patch
- type Tracker
- func (t *Tracker[K]) Flush() []Patch[K]
- func (t *Tracker[K]) FlushKey(key K) *Patch[K]
- func (t *Tracker[K]) IsDirty(key K) bool
- func (t *Tracker[K]) IsFieldDirty(key K, field int) bool
- func (t *Tracker[K]) Len() int
- func (t *Tracker[K]) Remove(key K)
- func (t *Tracker[K]) SetField(key K, field int)
- func (t *Tracker[K]) SetFields(key K, fields ...int)
- func (t *Tracker[K]) Version(key K) uint64
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Patch ¶
type Patch[K comparable] struct { Key K // 实体标识 Fields []int // 本次变更的字段 ID 列表(升序) Version uint64 // 变更后的版本号 }
Patch 是一个实体的字段级增量描述。
type Tracker ¶
type Tracker[K comparable] struct { // contains filtered or unexported fields }
Tracker 维护每个实体的字段级脏位图。K 是实体标识类型(string/int/…)。 非零值:用 NewTracker 构造。
func (*Tracker[K]) IsFieldDirty ¶
IsFieldDirty 检查实体 key 的字段 field 是否脏。
func (*Tracker[K]) SetField ¶
SetField 标记实体 key 的字段 field 已修改。field 是字段的数字 ID(由业务约定, 如 protobuf field number 或自定义的枚举常量)。 仅当字段之前未标脏时递增版本号。
Click to show internal directories.
Click to hide internal directories.