close
純粹是拿來作猜測的,畢竟手頭上並沒有TRA的Code

一步一步來探討

一、玩家介面與遊戲物件屬性

玩家介面最主要分為五個較為常用

dorf1.php
用來描述目前玩家的"某一城鎮"的基本資源狀況
內容有:該村目前的資源量、分項資源產量、各資源田的等級
村內兵力總合、對外及對內攻擊與移動數量及最小到達時間
dorf2.php
用來描述目前玩家的"某一城鎮"的城內建築狀況
內容有:村內的各位置的建築種類以及其等級

build.php
由dorf1.php與dorf2.php的資源田或建築單位為入口
進入後會依照該建築所在地之設定,有不同表現
如果id<18之前是以該村所在田地之資源分配作設定
如果id>18之後則是以玩家設配合建築樹之規則來列出
如果id>18而且該位置上已經有建築(uid!=null)則列出該建築相對應之建築表單

a2b.php
由dorf2.php進入集結點所在之build.php之後,會提供該村的發兵連節,即a2b.php
或由地圖上指定村裝所在地、會附有"發兵"連結,一樣會連到a2b.php
另外a2b.php也帶有開新村的功能。

二、遊戲內物件及其屬性

<玩家>

<村莊>(玩家::村莊)

<建築>(玩家::村莊::建築)

<兵力>(玩家::村莊::兵力)

<資源>(玩家::村莊::資源)

三、系統前後端概念及task Queue

純推測
這個遊戲會在每一個task都對於DB作query
不知道Travian的廠商會用MySQL還是用Ora,別告訴我是用M$,通常用php的人都不愛用M$
但是MySQL並沒有PL/SQL那麼強大而且完整的SQL支援
至少我在5.0以前用sub query用的很痛苦,後來火大就不再碰MySQL(另一個原因就是進公司有Ora可以玩)

說回來了
如果以build.php來排程的話,例如我在村莊vid=2046設定了bid=18要升級到LV9
在列出build.php的當下,會去檢查ResourceOf(Village)以及PreRequire(type of Building, Village)
如果符合就可以開始送出task到Queue裡面
然後這個Queue會帶有Village, location, Building Type, Finished Time

不知道這樣子的設計會不會有問題,但是當一個世界裡面有801*801個村,然後光是建築在一秒內就有可能各有1~2個Task
光是建築的最大值每秒大概10萬個
如果全部推進到Database去作,我懷疑作不作得完.......
不過那是以最大值來推算

如果還要牽扯到多波壓秒壓在同一個WW村(不過即便是全天下的人同時去壓秒同一村,最大值也不過就是10萬個/秒)

而另外,在這些task處理的過程中
其實在server與client之間其實是有所謂認知時間差的關係

我目前不確定的是TRA是否是以realtime來作計算
如果是以建築來說,因為不牽扯到兵力,所以可以用Precalculation的方式來處理?
例如說Server事先可以算好某村在某時間之後的資源產量,然後時間到了之後再把預先算好的值寫回?
但是以交戰事件來說,一般伺服器可能可以有十到五分鐘的buffer讓伺服器去把交戰的結果先算好
如果是以speed server的話,最快到兵/支援可以在兩分鐘內到,不知道這樣來不來得及

所以,以speed server來說,同時這個伺服器上面有13隻WW好了,如果全地圖都滿村,然後大家都出兵在跨年0點0分0秒打到WW
這時候伺服器上面就真的會有將近10萬筆的update要作,而且這個是以瞬間要處理完的
而且還不考慮到所謂的壓秒.....如果全天下的人都用外掛來壓秒,每秒壓出20波好了
那整個server要處理request的數量應該就要到200萬以上?怎麼可能....==
(雖然以目前的S5.tw村莊數大概是在3萬左右,但是遊戲也才從初期進入到大概1/3而已)
假如滿村以70%來算,五萬村,那五萬村交相攻擊/支援,每一秒包括壓秒給他10個動作好了,那少說也是50萬....

我想來想去
Web Game不是個簡單的架構(如果有夠多人玩的話)



arrow
arrow
    全站熱搜

    正港眼虫 發表在 痞客邦 留言(0) 人氣()