Hay Day系统设计沉思录——数据存储
2013-11-10 20:16
323 查看
对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格式的文件,去除了表现类的属性,比如纹理和动画信息等)。
欲知后事如何,请看下回分解
服务器会对所有逻辑相关的农场中对象进行存储:
(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格式的文件,去除了表现类的属性,比如纹理和动画信息等)。
欲知后事如何,请看下回分解
相关文章推荐
- 业务系统设计要考虑的问题(一)分散式数据存储设计
- 股票数据存储系统(Key-Value存储)设计与实现
- 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储
- 基于SST25VF020的数据存储系统设计
- BigTable是Google设计的分布式数据存储系统
- 百亿数据毫秒响应级交易系统读写分离存储数据设计
- 数据结构课程设计之银行活期存储系统(设计报告)
- Hay Day系统设计沉思录——操作序列与网络
- 数据结构课程设计-通讯录管理系统c++版(顺序表存储,折半查找,递增排序)
- 一种NVMe SSD友好的数据存储系统设计 推荐
- 面向数据可靠性存储系统设计思想探讨
- 豆瓣开源数据存储系统BeansDB
- 软件架构设计【三】-系统架构中的数据分布设计
- 【ERP系统设计】【数据模块】2 安装Eclipse多国语言包
- 动态产生的持久模型和数据存储的设计模式
- Hive数据仓库ODS层数据存储设计
- 高并发操作和查询的数据采集和查询系统的oracle数据库设计建议
- Android存储系统的架构与设计
- SQL Server 2005 大数据量数据存储设计思路分享
- 中小企业如何设计存储系统方案