背包
业务需求
网络游戏游戏背包的表现为一堆格子,格子可以空着,也可以被物品填充。背包的情况储存情况可以被持久化。
- 一个物品占一个格式
- 一个物品占多个各种
物品唯一id
如果背包系统比较简单,可以只用物品配置id和物品数量来表示背包中的物品。但是很多情况下背包里会有许多物品配置id相同的物品,物品可能还会附加一下特殊属性。所以游戏中物品的唯一id就显得很有必要。
格子的数据结构
数组结构
数组结构能简单直观地模拟背包容量的真实情况,一般数组下标代表格子的位置,数组元素代表具体背包物品。在算法上,01背包问题是一个经典的动态规划算法问题,而01背包就是用一个简单的数组来模拟背包(游戏中的背包大多是一维数组,而背包算法问题中的数组一般是二维数组)。
背包查找
受限于数组结构,数组背包在查找时需要遍历背包元素,找出符合要求条件的物品。所以当背包数组十分庞大时,性能上就会受到影响。
背包变化
物品的添加需要遍历数组寻找空位插入。扣除时需要遍历数组寻找到符合条件的位置和物品。
背包整理和排序
数组可以直接排序,遍历数组,将分散的物品按特定的顺序重新放入数组,将可以叠加的物品叠加起来。
map结构
map结构模拟背包,可以用格子位置组作为主键,物品本身作为值。
背包查询
因为使用map结构,能够迅速索引出背包中的物品。
背包变化
背包物品的添加和扣除比较方便,只要知道物品的位置和数量就行。
背包物品的变化量
每一次背包物品的变化都需要同步给前端,但是每次都把所有背包信息数据同步过去无疑是毫无必要的,所以最好的办法是只同步改变的变化量。
变化标志
使用数组数据结构的背包: 背包物品添加、减少、交换位置时,使用一个或者多个变化标志记录记录格子空间的变化。当背包发生改变时,只同步变化标志记录中的。当背包整理时,变化标志会被重置。
使用Map数据结构的背包:背包物品添加、减少、交换位置时,背包物品唯一id或者配置id的数量变化会被变化标志记录,同步时只发送这部分的数据。
背包数据储存
背包数据与玩家关联密切,所以一般以玩家唯一id作为主键,储存整个背包。
使用关系型数据库,如Mysql数据库时,一般直接用Lob类型字段储存。