這一篇仍然只是一個假設,他不是真正的作法
如果說Travian的遊戲世界中的物件分成
玩家,村莊,建築
那我假設玩家為
[object user]
user id,
user name,
user basic information.....{},
create date,
last login date,
user villages[],
login IP recrod[] //疑?好邪惡...
[object user::villages]
village Id,
village name,
--village kartid, //其實是可以用算的啦
village coord[x,y],
village building[], //或是可以拆成resource[18], building[20] //但是這中間是否要直接放入每一個building的等級跟狀況?
task finish time,
task target. //只要記住location就好了吧
[object user::villages::building]
bid,
building type,
building level,
building status.
===========================================
以一個村內的建築為例,目前某村可能接近普七
那他的resource[18]可能會是
[5,6,6,4,5,7,8,5,5,4,.....]
然後目前玩家login到這個server的時候只會去query一次
然後會帶出task finish time
如果登入時間為2009/11/12 15:28:07 然後task finish time= 2009/11/12 18:47:44
如果要倒數什麼的,由client去吃玩家的資源,基本上server不動
然後會有一個task target,時間到了就會去update
假設task target = 2的話,時間到了之後resource[18]會等於[5,6,7,4.........]
當然,這個連動會影響到user的資源輸出......
============================================
當然,一個村莊一定是需要另一個地方來單獨存他的resource產出跟目前resource所剩下的值(吧?)
(難道要放在同一個table?我覺那不好,因為其他人可能會因為攻擊而使得資源改變)
光是偵察就可以省掉去query整個village object的data的時間,只要village id對得到就好
什麼時候會去對資源作query?
一、要蓋建築物的時候
二、要送出商人的時候
三、這個村莊被攻打的時候
四、有商人送入資源的時候
============================================
如果是task,我是不是就直接先寫入計算之後的結果
然後在query的時候就以目前的status
所以database會以寫入為主,而不作update
基本上我會"以為"單純的 insert 會比 update 來得有效率
但是我們家的DBA又告訴我說 insert 與 update 其實沒有太的差別
(這個嘛,再看哪個神人可以給我解答好了)
============================================
我在時間到了之前去推進一個task運算出來的結果
其實這些都是已經pre calculate & load完成的
============================================
這樣來說,集結點的兵力其實也是可以用pre calculation & load
是說如果我比較有良心的話,其實你的login session登入的時候已經先幫你算好未來多少筆的資料
但是會有一個隱憂
比如說在下我個人自己曾經犯賤用過單筆多波派兵
然後派一個兵然後佯攻2000波,對方寫信來幹醮
如果ADM有進DB去看的話,照這種non sense的設計,DBA也會寫信來幹醮
我的單村派兵task就高達1000個raw的話,基本上DB會被玩家玩到炸開
如果我們公會60人有20個用我的外掛,一個人發1000波,也還好,兩萬
3000個玩家一人發1000波的時候,三百萬......即便是不先pre calcuate好了
把這些東東Load到session裡面,也才1000筆(一筆1K也才1MB) 好吧,1000個玩家惡搞也才吃1G的RAM
============================================
總之.............
DB跟RAM Service各半處理吧
文章標籤
全站熱搜
