這一篇仍然只是一個假設,他不是真正的作法 如果說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各半處理吧
文章標籤
全站熱搜
創作者介紹
創作者 正港眼虫 的頭像
正港眼虫

白貓宅急便-御飯糰