对Hay Day的农场数据的存储进行一些推断。
服务器会对所有逻辑相关的农场中对象进行存储:
(1) 对象在当前玩家农场中的唯一标识 ID
(2) 对象的类型
(3) 对象的属性, 公共属性包括朝向(左右镜像),位置(x, y) ,私有属性根据类型的不同而不同
这样,服务器在玩家登录时下发的协议结构大致如下:
message FarmInfo
{
repeated Land lands = 1; // 田地信息
repeated AnimalFold animal_folds = 2; // 动物圈养信息(如牛,鸡,猪,羊等)
repeated GoodsMachine goods_machines = 3; // 货物机器信息(面包机,烧烤机等)
repeated WareHouse ware_houses = 4; // 仓库信息(包括货仓和粮仓)
repeated NaturalObject natural_objects = 5; // 自然物件(如大树,小树,石头等)
// 其他信息......
};
// 田地信息可以这样设计:
message Land
{
required uint32 id = 1; // 对象的唯一标识
requried Position pos = 2; // x,y 坐标
required bool is_right_dir = 3 // 是否朝右
optional short state = 4; // 状态(包括空闲,作物成长,作物成熟)
optional short crop_type = 5; // 作物种类(包括麦子,甘蔗,玉米等),在非空闲状态下有意义
optional uint32 growed_time = 6; // 已经成长了的时间,单位为秒,在作物成长状态下有意义
}
message AnimalFold
{
required uint32 id = 1; // 对象的唯一标识
requried Position pos = 2; // x,y 坐标
required bool is_right_dir = 3 // 是否朝右repeated Animal animals = 4; // 动物信息
}
message Animal
{
required uint32 id = 1; // 对象的唯一标识
required short type = 2; // 种类
requried short state = 3; // 饥饿,生产,待收集
optional uint32 produced_time = 4; // 已经生产了的时间,单位为秒,在生产状态下有意义
}
// 其他信息........
在这里只简单列出来田地信息的结构,其他的结构信息就不用赘述了,原则就是缺什么就加字段,并且注意同类信息的结构复用。
客户端的每一次逻辑操作,都会形成操作序列,经固定间隔发送给服务器进行验证,验证通过后,服务器会修改存储的数据。
可以大概估算一下用户登录的时候,服务器的发包大小:
如果用户有60块land,10个animalFold,30个GoodsMachine,200个NatrualObject,假设land,animalFold,GoodsMachine的字节平均大小为40,这里一共是100*40 = 4000字节;而NatrualObject的字节上限为10字节(信息比较少),差不多是200*10 = 2000字节,再加上其他杂七杂八的,应该最后不超过10000字节,也就是10KB,这样看来还不存在初始包体大小瓶颈。
客户端如果用cocosBuidler制作初始场景的时候,需要修改插件,使之可以导出初始逻辑地图信息给服务器(可以是xml格式的文件,去除了表现类的属性,比如纹理和动画信息等)。
欲知后事如何,请看下回分解