對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格式的文件,去除了表現類的屬性,比如紋理和動畫信息等)。
欲知後事如何,請看下回分解