本帖最后由 空伊伊 于 2023-11-8 17:28 编辑
模块管理和数据中心
目录
为什么要使用模块管理①
模块管理的使用步骤②
模块管理的各功能介绍③
为什么要使用数据中心④
数据中心的使用步骤⑤
数据中心的各功能介绍⑥
为什么需要数据中心?
1.数据中心可以帮助我们将数据进行永久存储
我们在定义一个数据类的时候,可以通过给属性字段添加 @Decorator.persistence() 这个装饰器来让数据被永久存储。
2. 数据中心实现了服务端和客户端的数据同步
已知,DataStorage的方法只能在服务端调用生效,所以数据中心帮我们封装了数据同步,让我们能在双端都能取到想要的数据。这里简单介绍一下数据同步的时间点:
首次同步:DataCenterS 会监听玩家上线,当玩家上线的时候会从KV服务器上获取PlayerData同步给对应客户端
保存同步:每次在服务端调用SubData的save(true)方法时,会将数据同步给对应的客户端
主动同步:每次在服务端调用SubData的syncToClient()方法时,会将数据同步给对应的客户端
3. 数据中心实现了数据缓存,降低与KV服务器的交互频率
已知,直接使用DataStorage来存储数据,会有频率限制
【总频率限制】
接口调用时至一分钟前的时间区间内,某个Key的对应值在KV服务器上被获取Get、改写Set、删除Remove的总次数不能超过 (60+游戏设定的最大人数×10)次,不管它是在哪个ds服务器被操作的;如果时间区间内超限,请求会失败,然后Set、Remove会返回 FREQUENCY_OVERRUN(操作失败:请求频率超限) 而Get会catch到error timeout。
【改写间隔限制】
对于某个Key的对应值,在KV数据服务器上进行了1次改写Set 或 删除Remove操作后,该Key的对应值将会被锁定6s,在这6s内将无法再被Set、remove,尝试将会返回 FREQUENCY_OVERRUN(操作失败:请求频率超限),直到6s过去解锁后才可修改。
数据缓存的实现原理:每个玩家在DataCenterS上会有一份PlayerData,玩家每次修改数据都是对这个PlayerData进行修改,然后每隔10秒以及玩家下线时,会调用 DataStorage.asyncSetData 来保存一次数据。这样就避免了与KV服务器交互频率过高的问题。
所以使用数据中心存储数据,就不需要考虑存取频率的问题啦~。不过得考虑RPC的频率,因为存和取都得在服务端进行,频率太高会导致服务端压力太大
4. 数据中心实现了模块数据的统一管理
举个例子,假如现在一个玩家有背包数据、关卡数据、天赋数据,我们使用数据中心保存和使用它们
export class BagData extends Subdata {
/**背包物品 */
@Decorator.persistence()
bagItem: [] = [];
/**背包皮肤 */
@Decorator.persistence()
bagSkin: string;
public saveBagData() {
this.save(true)
}
}
export class LevelData extends Subdata {
/**关卡数据 */
@Decorator.persistence()
levelID: number
public saveLevelData() {
this.save(true)
}
}
export class TalentData extends Subdata {
/**天赋数据 */
@Decorator.persistence()
myTalent: [] = []
public saveTalentData() {
this.save(true)
}
}
// 在S端获取各个数据
DataCenterS.getData(player, BagData)
DataCenterS.getData(player, LevelData)
DataCenterS.getData(player, TalentData)
// 在C端获取各个数据
DataCenterC.getData(BagData)
DataCenterC.getData(LevelData)
DataCenterC.getData(TalentData)
由上可见,这样做有3个好处:
【定义数据方便】数据体只需要继承SubData,数据就能自动被DataCenter管理起来
【保存数据方便】保存数据只需要调用父类SubData的save方法,即可实现保存
【获取数据方便】获取数据只需要传入数据体的类名,即可获取到对应数据
下一节:数据中心的使用步骤⑤ |