Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q44: 如何设计背包系统?

核心结论

背包系统表面上是格子管理,实质上是“物品所有权加容量约束加资产安全”的组合系统。

真正难点通常不在拖拽物品,而在:

  • 物品唯一性和堆叠规则
  • 绑定、过期、不可交易限制
  • 并发操作和重复扣发
  • 背包满、拆分、排序、批量操作的边界

只要把背包当成简单数组,后面交易、邮件、拍卖、掉落一接进来就会出问题。

一、先明确背包系统的职责

它通常需要负责:

  • 保存玩家持有物品
  • 管理槽位或容量
  • 处理添加、删除、移动、拆分、合并
  • 支持使用、出售、交易、邮件附件、拍卖等外围系统

这意味着背包既是表现系统,也是资产系统入口。

二、物品模型要先分清

常见至少要区分:

  • 可堆叠物品
  • 唯一实例物品
  • 装备类实例
  • 临时物品
  • 绑定物品

如果所有物品都用同一种结构,后面规则会越来越难写。

三、槽位式背包和容量式背包的差别

1. 槽位式

更强调:

  • 格子限制
  • 排序和摆放
  • 拆分与合并

这类系统更接近传统 RPG 背包体验。

2. 容量式

更强调:

  • 物品总数或总重量
  • 不强依赖具体格子位置

这种更适合弱表现、强功能导向场景。

不同设计会直接影响客户端表现和服务端数据模型。

四、堆叠规则必须非常清楚

要先定义:

  • 哪些物品可堆叠
  • 最大堆叠数量
  • 不同绑定状态能否合并
  • 过期时间不同的物品能否合并

这些都直接影响后续添加和拆分算法。

五、背包操作为什么要强调原子性

背包不是普通 UI 状态,它经常和高价值资产绑定。

例如:

  • 拾取
  • 使用消耗
  • 交易扣除
  • 邮件领取
  • 拍卖上架

这些操作如果不是原子处理,就很容易出现:

  • 重复获得
  • 重复扣除
  • 显示和真实状态不一致

六、背包系统和外部系统的边界要稳

一个更稳妥的原则通常是:

  • 外部系统提出“增删改物品请求”
  • 背包系统统一做合法性校验和提交

而不是每个子系统直接改背包数据。

这样更容易保证:

  • 容量检查一致
  • 并发规则一致
  • 审计和流水可追踪

七、工程上要特别注意的点

1. 唯一实例物品

装备、带随机词条或强化等级的物品,通常应有独立实例 ID。

2. 并发与重复请求

客户端重复点击、断线重发、跨系统重试,都可能把背包链路打乱,所以关键操作需要幂等和锁定策略。

3. 变更流水

高价值物品变化最好保留:

  • 来源
  • 去向
  • 数量
  • 关联操作 ID

八、常见误区

1. 背包就是一个 vector 或数组

表现层也许像数组,但系统层远不止如此。

2. 只要客户端能拖动排序,服务端照着改就行

客户端只能表达意图,最终合法性仍应由服务端决定。

3. 所有物品都能走统一堆叠逻辑

唯一实例、绑定状态、过期时间都会破坏这种简化。

参考资料

  • 各类在线游戏背包、物品实例化与资产流水实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu