fieldmask

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2026 License: Apache-2.0 Imports: 2 Imported by: 0

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

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 NewTracker

func NewTracker[K comparable]() *Tracker[K]

NewTracker 创建字段脏追踪器。

func (*Tracker[K]) Flush

func (t *Tracker[K]) Flush() []Patch[K]

Flush 取走并清空所有脏实体的字段列表。每帧末调用一次,返回所有需要增量同步 的实体及其脏字段。调用后所有脏标记被清除。

func (*Tracker[K]) FlushKey

func (t *Tracker[K]) FlushKey(key K) *Patch[K]

FlushKey 取走并清空单个实体的脏字段。未修改时返回 nil。

func (*Tracker[K]) IsDirty

func (t *Tracker[K]) IsDirty(key K) bool

IsDirty 检查实体 key 是否有脏字段。

func (*Tracker[K]) IsFieldDirty

func (t *Tracker[K]) IsFieldDirty(key K, field int) bool

IsFieldDirty 检查实体 key 的字段 field 是否脏。

func (*Tracker[K]) Len

func (t *Tracker[K]) Len() int

Len 返回当前有脏字段的实体数量。

func (*Tracker[K]) Remove

func (t *Tracker[K]) Remove(key K)

Remove 删除实体的所有追踪记录(实体销毁时调用)。

func (*Tracker[K]) SetField

func (t *Tracker[K]) SetField(key K, field int)

SetField 标记实体 key 的字段 field 已修改。field 是字段的数字 ID(由业务约定, 如 protobuf field number 或自定义的枚举常量)。 仅当字段之前未标脏时递增版本号。

func (*Tracker[K]) SetFields

func (t *Tracker[K]) SetFields(key K, fields ...int)

SetFields 批量标记多个字段。仅在至少有一个新脏字段时递增版本号。

func (*Tracker[K]) Version

func (t *Tracker[K]) Version(key K) uint64

Version 返回实体的当前版本号(每次 SetField/SetFields 递增)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL